shell 语法
注释
一行中 #
及其后面的字符会被 shell 忽略,这被称为注释。
$ # echo foo
$ echo foo # comments
foo
引号
引号将字符包裹起来恢复其字面量,单引号里面所有特殊字符均恢复字面量,而双引号则保留 $
`
\
这 3 个符号的特殊含义 (`
是反引号)。请看下面的例子:
$ echo foo # bar
foo
$ echo "foo # bar"
foo # bar
$ echo 'foo # bar'
foo # bar
$
$ echo "$USER"
linux-20
$ echo '$USER'
$USER
echo foo # bar
其中 # bar
为注释,用引号包裹起来则恢复 #
字面量。双引号中仍然可以使用变量,而单引号不可以。
转义字符
转义字符可恢复特殊字符的字面量,例如:
$ echo "$USER"
linux-20
$ echo "\$USER"
$USER
$ echo "\"foo\""
"foo"
换行符 \n
echo
可以一次输出多行文本,请看下面的例子:
$ echo "foo\nbar"
foo\nbar
$ echo -e "foo\nbar"
foo
bar
echo -e
开启转义序列,可识别换行符 \n
、制表符 \t
等符号。
命令序列
可以在一行书写多条独立的命令,它们会按顺序执行,这需要下列符号支持:
;
多条命令写在一行用;
隔开,将按顺序执行。&&
若前面的命令返回值为非零 (执行成功),则继续执行后面的命令。||
若前面的命令返回值为零 (执行失败),则继续执行后面的命令。&
可将多条命令隔开,类似;
,不同点在于此符号放在命令末尾将调用子进程异步执行该命令,也称为后台任务。
例如:
$ echo foo; echo bar
foo
bar
$ echo foo && echo bar
foo
bar
$ echo foo || echo bar
foo
$
$ echofoo && echo bar
-bash: echofoo:未找到命令
$ echofoo || echo bar
-bash: echofoo:未找到命令
bar
后台任务
&
可用于执行后台任务,请看下面的例子:
$ sleep 3; echo foo
foo
$ sleep 3& echo foo
[1] 26056
foo
$ jobs
[1]+ 已完成 sleep 3
$
$ sleep 100& sleep 500&
[1] 26108
[2] 26109
$ fg 1
sleep 100
^C
$ jobs
[2]+ 运行中 sleep 500 &
$ kill %2
$ jobs
[2]+ 已终止 sleep 500
sleep 3; echo foo
会延迟 3 秒再执行 echo
;将 ;
换成 &
则 sleep
在子进程执行,不会阻塞后面的命令。
jobs
可列出活动的后台任务,fg
可将后台任务切换到前台 (然后按 Ctrl
+ C
可终止),kill
可直接终止后台任务。
命令返回值
一条命令执行完成后会得到一个返回值 (exit status),这个值保存在 $?
,请看下面的例子:
$ echo foo; echo $?
foo
0
$ echofoo; echo $?
-bash: echofoo:未找到命令
127
$ echofoo && echo $?
-bash: echofoo:未找到命令
返回值为零表示执行成功,非零表示执行失败。&&
需要前一条命令的返回值为零才执行后面的命令。