#!/bin/bash是指此脚本使用/bin/bash来解释执行。
其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。
bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh,...
我们可以通过以下一个示例来进行实验,了解#!/bin/bash的使用。
除第一行外,脚本中所有以“#”开头的行都是注释。
1)#!/bin/bash只能放在第一行,如果后面还有#!,那么只能看成是注释。
这里有三个脚本(脚本都要使用”chmod +x scriptname“命令来获得可执行权限):
tbash1.sh:
#!/bin/sh
source abc
echo "hello abc"
tbash2.sh:
#!/bin/bash
source abc
echo "hello abc"
tbash3.sh:
source abc
echo "hello abc"
三个脚本执行的结果:
[nsvc@localhost other]$ ./tbash1.sh
./tbash1.sh: line 2: abc: No such file or directory
注:当source命令执行有问题时,sh不再往下面执行。
[nsvc@localhost other]$ ./tbash2.sh
./tbash2.sh: line 2: abc: No such file or directory
hello abc
注:当source命令执行有问题时,bash继续执行下面命令。
[nsvc@localhost other]$ ./tbash3.sh
./tbash3.sh: line 1: abc: No such file or directory
hello abc
注:自身登录系统所在的shell是bash。所以,当source命令执行有问题时,bash继续执行下面命令。
如果将tbash1.sh改成:
echo "abc"
#!/bin/sh
source abc
echo "hello abc"
那么,执行结果是:
[nsvc@localhost other]$ ./tbash1.sh
abc
./tbash1.sh: line 3: abc: No such file or directory
hello abc
也就是说,脚本忽略了第二行“#!/bin/sh",直接使用当前所在的shell(也就是bash)来解释脚本。
当把tbash1.sh改成:
#!/bin/sh
#!/bin/bash
source abc
echo "hello abc"
执行结果为:
[nsvc@localhost other]$ ./tbash1.sh
./tbash1.sh: line 3: abc: No such file or directory
当执行完source命令时,并没有往下执行。说明,#!/bin/sh这一行起到作用了,但#!/bin/bash并没有起作用。在脚本中,除第一行外,脚本中所有以“#”开头的行都是注释。
2)#!后面的路径一定要正确,不正确会报错。
假如,我们把tbash1.sh中第一行的#!后面加了一个不存在的路径”/home/sh“:
#!/home/sh
source abc
echo "hello abc"
执行结果为:
[nsvc@localhost other]$ ./tbash1.sh
-bash: ./tbash1.sh: /home/sh: bad interpreter: No such file ordirectory
系统会提示/home/sh的路径不存在。
3)如果一个脚本在第一行没有加上#!+shell路径这一行,那么,脚本会默认当前用户登录的shell,为脚本解释器。
在1)中,脚本tbash3.sh的执行结果,就是用当前自己登录的shell(bash)解释后的结果。我们通常所用的shell都是bash,如果哪天登录到sh,再使用以上类型的脚本,就会有问题。以下是自己登录到sh下,执行tbash3.sh的结果:
-sh-3.2$ ./tbash3.sh
./tbash3.sh: line 1: abc: 没有那个文件或目录
与1)中的执行结果是不一样的。
因此,大家应该养成脚本首行加上#!+shell路径的习惯。
4)/bin/sh相当于/bin/bash --posix
我们将脚本tbash1.sh改为:
#!/bin/bash --posix
source abc
echo "hello abc"
执行结果:
[nsvc@localhost other]$ ./tbash1.sh
./tbash1.sh: line 2: abc: No such file or directory
与tbash1.sh原脚本执行的结果一样。
我们还可以以tbash3.sh为示例。
用以下命令来执行该脚本:
[nsvc@localhost other]$ bash tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
hello abc
[nsvc@localhost other]$ sh tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
[nsvc@localhost other]$ bash --posix tbash3.sh
tbash3.sh: line 1: abc: No such file or directory
"bash tbash3.sh"表示使用bash来作为脚本解释器来执行tbash3.sh。同样,也可以使用如”sh脚本名“这样的命令,来用sh作为脚本解释器。
从结果可以看出,/bin/bash--posix与/bin/sh的执行结果相同。总结起来,sh跟bash的区别,实际上是bash有没开启posix模式的区别。遵守posix规范,可能包括,”当某行代码出错时,不继续往下执行。“
最后加上一点说明,每个脚本开头都使用"#!",#!实际上是一个2字节魔法数字,这是指定一个文件类型的特殊标记,在这种情况下,指的就是一个可执行的脚本。在#!之后,接一个路径名,这个路径名指定了一个解释脚本命令的程序,这个程序可以是shell,程序语言或者任意一个通用程序。
相关推荐
_bin_bash”的作用详解 #### 一、引言 在Shell脚本编程中,我们经常会看到脚本的第一行是`#!/bin/bash`或`#!/bin/ksh`这样的语句。对于初学者来说,这行代码可能会显得有些神秘,但实际上它具有非常重要的意义。...
- Stack Overflow 和其他技术论坛:这些平台上有许多关于 Expect 的问题和解决方案,是学习和解决问题的好地方。 在给定的压缩包文件中,ssh_run.sh 可能是一个使用 Expect 编写的SSH自动化脚本。你可以通过查看和...
ubuntu执行.sh文件,1 .sh文件是Ubuntu下可执行文件,首先需要确定它的权限是否是可执行的,2、 用vim打开sh文件,3、查看文件格式:4. 修改文件格式: 5. 保存退出: 6. 执行:./filename .../bin/bash
CentOS7.4下编译测试通过。改进了程序并增加了安装说明。 # cat README 1、以root身份执行如下语句.../bin/bash for M in lib80211 cfg80211 wl; do modprobe $M &>/dev/null done 这样,驱动就会开机启动啦!
/bin/bash` 是一个shebang,指定该脚本使用bash解释器执行。 2. `JAR_FILE_PATH`变量存储了JAR文件的完整路径。 3. `MAIN_CLASS`变量定义了Java程序的主要类名,这是JAR文件的入口点。 4. 使用`nohup`命令启动Java...
`sh`脚本是基于Bash shell编写的,因此我们需要熟悉Bash的一些基本语法,如变量赋值、条件语句和循环结构。例如,我们可以定义一个变量来存储jar包的路径: ```bash JAR_FILE_PATH="/path/to/your/app.jar" ``` ...
在Windows下写了一个shell脚本,上传到Linux下执行时报错: 代码如下:[root@localhost test]# ./test.sh -bash: ./test.sh: /bin/sh^M: bad interpreter: No such file or directory test.sh源码: 代码如下:#!/bin...
/bin/bash sudo /usr/bin/python "$@" 给到其执行权限: chmod +x ~/bin/python-sudo.sh 第二步 让当前用户执行 sudo python 不需要输入密码执行: sudo visudo -f /etc/sudoers.d/python 此时会自动创建 /etc/
因此,当构建脚本尝试通过`/bin/sh`执行时,实际上是在调用dash,而非预期中的bash。 #### 三、解决方案 针对上述问题,可以采取以下几种解决方案: 1. **修改脚本第一行**: - 如果是独立的脚本文件出现问题,...
/bin/bash # Name:ping.sh # Path:/shell02/ # Usage:/shell02/ping.sh # ... #获取远程主机的IP地址(定义变量让用户自己输入) read -p "请输入你要ping的远程主机IP:" IP #使用ping命令来判断是否和远程主机互通...
/bin/bash #!/bin/rm # 自删除脚本. LOG_DIR=/var/log ROOT_UID=0 # $UID 为 0 的时候,用户才具有根用户的权限 LINES=50 # 默认的保存行数 E_XCD=66 # 不能修改目录? E_NOTROOT=67 # 非根用户将以 error 退出 if ...
/bin/bash step=1 #间隔的秒数,不能大于60 for (( i = 0; i < 60; i=(i+step) )); do $(php '/home/www/php/crontab/crontab.php') sleep $step done exit 0 二、crontab -e 输入以下语句,然后:wq 保存退出 ...
- **Bash shell** (`/bin/bash` 或 `/usr/bin/bash`):Bourne Again SHell,它是Bourne shell的扩展,提供了更多的功能和改进。 - **Korn shell** (`/bin/ksh` 或 `/usr/bin/ksh`):结合了Bourne shell和C shell的...
通过上述分析可以看出,本文档不仅介绍了BASH脚本的基本概念和语法,还提供了丰富的实战案例,非常适合初学者快速上手。学习者可以通过实践这些例子来加深理解和记忆,逐步提高自己的脚本编写能力。
/bin/sh`或`#!/bin/bash`,这被称为sha-bang行。这一行指定了脚本将被哪个解释器执行。例如: ```bash #!/bin/bash ``` 这段代码意味着脚本应该由`bash`解释器来执行。 #### 三、Shell脚本的核心要素 ##### 3.1 ...
"人性化解析shell脚本,快速入门sh、bash、shell入门" Shell脚本是Linux操作系统中的一种编程语言,用于自动化系统管理和任务执行。本文档旨在快速入门Shell脚本,帮助读者快速掌握Shell脚本的基本知识和使用方法...
/bin/bash for ip in $(seq 1 254); do ping -c 1 192.168.1.$ip &> /dev/null if [ $? -eq 0 ]; then echo "IP $ip is reachable." fi done ``` 这段脚本会遍历192.168.1.1到192.168.1.254的每个IP地址,通过...
/bin/bash`是Shebang,告诉系统使用Bash shell来执行脚本。`$@`代表传递给脚本的所有参数,使得你可以指定目录或文件进行列举。 其次,`pwd`命令显示当前工作目录。创建一个`my_pwd.sh`文件,内容如下: ```bash #!...
在Linux和Unix系统中,常见的Shell有Bash(Bourne-Again SHell)、Sh、Csh、Ksh等。本文主要关注的是Bash Shell,因为它是最常用且功能强大的Shell之一。 在编写Shell脚本时,我们通常会以`#!/bin/bash`作为脚本的...