我对shell脚本的理解是写一个文件指示shell如何执行命令
bash中的shell脚本语法:
1.在bash中为变量赋值的语法是foo=bar
,访问变量中存储的数值,其语法为 $foo
。 需要注意的是,foo = bar
(使用空格隔开)是不能正确工作的,因为解释器会调用程序foo
并将 =
和 bar
作为参数。 总的来说,在shell脚本中使用空格会起到分割参数的作用,有时候可能会造成混淆,请务必多加检查。
2.Bash中的字符串通过'
和 "
分隔符来定义,但是它们的含义并不相同。以'
定义的字符串为原义字符串,其中的变量不会被转义,而 "
定义的字符串会将变量值进行替换。
foo=bar
echo "$foo"
# 打印 bar
echo '$foo'
# 打印 $foo
3.bash
也支持if
, case
, while
和 for
这些控制流关键字。同样地, , bash
也支持函数,它可以接受参数并基于参数进行操作。
mcd () {
mkdir -p "$1"
cd "$1"
}
这里 $1
是脚本的第一个参数。与其他脚本语言不同的是,bash使用了很多特殊的变量来表示参数、错误代码和相关变量。
-
$0
- 脚本名 -
$1
到$9
- 脚本的参数。$1
是第一个参数,依此类推。 -
$@
- 所有参数 -
$#
- 参数个数 -
$?
- 前一个命令的返回值 -
$$
- 当前脚本的进程识别码 -
!!
- 完整的上一条命令,包括参数。常见应用:当你因为权限不足执行命令失败时,可以使用sudo !!
再尝试一次。 -
$_
- 上一条命令的最后一个参数。如果你正在使用的是交互式shell,你可以通过按下Esc
之后键入 . 来获取这个值。
命令通常使用 STDOUT
来返回输出值,使用STDERR
来返回错误及错误码,便于脚本以更加友好的方式报告错误。 返回码或退出状态是脚本/命令之间交流执行状态的方式。返回值0表示正常执行,其他所有非0的返回值都表示有错误发生。
4.另一个常见的模式是以变量的形式获取一个命令的输出,这可以通过 命令替换 (command substitution)实现。
当您通过 $( CMD )
这样的方式来执行CMD
这个命令时,它的输出结果会替换掉 $( CMD )
。例如,如果执行 for file in $(ls)
,shell首先将调用ls
,然后遍历得到的这些返回值。
还有一个冷门的类似特性是 进程替换(process substitution), <( CMD )
会执行 CMD
并将结果输出到一个临时文件中,并将 <( CMD )
替换成临时文件名。这在我们希望返回值通过文件而不是STDIN传递时很有用。例如, diff <(ls foo) <(ls bar)
会显示文件夹 foo
和 bar
中文件的区别。
工具:shellcheck,用以检查语法错误,debian安装 apt-get install shellcheck,使用 shellcheck xxx.sh会输出错误信息。
关于shell脚本还可以参考《鸟哥的LINUX私房菜》第12章,以后用到再学。