shell脚本是包含shell可执行命令的文件,shell脚本中的命令可这是用户在shell提示符后面输入的任何命令。
#!告诉操作系统用哪个shell来执行这个文件。因为操作系统的试图执行文件之前将检查该程序的开头字符串,这些字符串让操作系统不必进行失败的尝试,如果脚本的前两个字符是#!,那么系统将这两个字符后面的那些字符作为用去执行该脚本的命令解释器的绝对路径名,它可以是任何程序的路径名,而并不仅能是shell,比如python的命令解释器。
#后面是注释
使用;和换行符分隔命令,换行符是一个独特的命令分隔符,因为它将启动该字符前面的命令执行,分号;也是一种命令分隔符,但是它并不立即启动命令执行,可以的单独一个命令行中连续个输入一串命令,并用分号;彼此分开,通过输入回车键启动这串命令:
$ x;y;z
对于命令x、y、z,这个命令行产生的结果与下面命令相同:
$ x
$ y
$ z
不同之处的于,下面的示例中,每个命令招待完毕学之后,shell均发出一个提示符,而前面的shell仅仅在z执行完之后才发出提示符。
\继续命令,当输入一个比较长的命令时,光标已经到达屏幕右端,这时可以用反斜杠字符\在下一行继续这命令。
在命令行中,可以的双引号中间输入回车符而不用反斜杠字符,此时输入的换行符将成为这个这个字符串的一部分:
$ echo " hello
> shell"
hello
shell
在双引号中输入反斜杠\
$ echo "hello \
> shell"
hello shell
在单引号中输入反斜杠\
$ echo 'hello \
shell'
hello \
shell
管道符|和后台任务符号&也是命令分隔符,它们并不开始执行命令而是在某些方面改变命令的功能。管道符改变标准输入的源或是标准输出的目的地。而后台任务符号使shell在后台执行该任务,这样用户可以立即得到一个提示符并继续其他工作。
$ x| y | z
$ ls -l | grep tmp | less
在第一个作业中,shell将任务x的标准输出重定向到任务y的标准输入,同时还将y的标准输出重定向到z的标准输入。因为整个作业的前台执行,所以的任务z运行完毕前shell不会显示提示符:在任务y结束前z不会结束,而的x结束前y不会结束;在第二个作业中,任务x是ls -l命令,任务y是grep tmp,任务z是分页less。
$ d & e & f
[1] 14271
[2] 14272
显示作业编号和进程id,在f结束后一会立即得到一个shell提示符,此时d或e还可能尚未执行完毕。
()命令分组,可使用括号进行命令分组
$ (a ; b) & (c ; d) & 这个命令在后台相继执行a和b,同时,在后台相继执行c和d;运行a和b的子shell和运行c和d的子shell同时运行。
#!告诉操作系统用哪个shell来执行这个文件。因为操作系统的试图执行文件之前将检查该程序的开头字符串,这些字符串让操作系统不必进行失败的尝试,如果脚本的前两个字符是#!,那么系统将这两个字符后面的那些字符作为用去执行该脚本的命令解释器的绝对路径名,它可以是任何程序的路径名,而并不仅能是shell,比如python的命令解释器。
#后面是注释
使用;和换行符分隔命令,换行符是一个独特的命令分隔符,因为它将启动该字符前面的命令执行,分号;也是一种命令分隔符,但是它并不立即启动命令执行,可以的单独一个命令行中连续个输入一串命令,并用分号;彼此分开,通过输入回车键启动这串命令:
$ x;y;z
对于命令x、y、z,这个命令行产生的结果与下面命令相同:
$ x
$ y
$ z
不同之处的于,下面的示例中,每个命令招待完毕学之后,shell均发出一个提示符,而前面的shell仅仅在z执行完之后才发出提示符。
\继续命令,当输入一个比较长的命令时,光标已经到达屏幕右端,这时可以用反斜杠字符\在下一行继续这命令。
在命令行中,可以的双引号中间输入回车符而不用反斜杠字符,此时输入的换行符将成为这个这个字符串的一部分:
$ echo " hello
> shell"
hello
shell
在双引号中输入反斜杠\
$ echo "hello \
> shell"
hello shell
在单引号中输入反斜杠\
$ echo 'hello \
shell'
hello \
shell
管道符|和后台任务符号&也是命令分隔符,它们并不开始执行命令而是在某些方面改变命令的功能。管道符改变标准输入的源或是标准输出的目的地。而后台任务符号使shell在后台执行该任务,这样用户可以立即得到一个提示符并继续其他工作。
$ x| y | z
$ ls -l | grep tmp | less
在第一个作业中,shell将任务x的标准输出重定向到任务y的标准输入,同时还将y的标准输出重定向到z的标准输入。因为整个作业的前台执行,所以的任务z运行完毕前shell不会显示提示符:在任务y结束前z不会结束,而的x结束前y不会结束;在第二个作业中,任务x是ls -l命令,任务y是grep tmp,任务z是分页less。
$ d & e & f
[1] 14271
[2] 14272
显示作业编号和进程id,在f结束后一会立即得到一个shell提示符,此时d或e还可能尚未执行完毕。
()命令分组,可使用括号进行命令分组
$ (a ; b) & (c ; d) & 这个命令在后台相继执行a和b,同时,在后台相继执行c和d;运行a和b的子shell和运行c和d的子shell同时运行。