Shell脚本基础入门 Bash注释
Bash只支持单行注释,使用#开头的都被当作注释语句:
# 整行注释 echo hello world # 行尾注释通过Bash的一些特性,可以取巧实现多行注释:
: ' 注释1 注释2 ' : <<'EOF' 注释1 注释2 EOF ____=' 注释1 注释2 '但是,别闲的蛋疼去用取巧的多行注释,安心用#来注释。
Bash基本数据类型Bash中基本数据类型只有字符串类型,连数值类型都没有(declare -i可强制声明数值类型)。
比如:
# 都会当作字符串 echo haha echo 1234 Bash字符串串联Bash中字符串的串联操作,直接将两段数据连接在一起即可,不需要任何操作符。
例如:
echo "junma""jinlong" echo 1234 5678 命令基本知识 变量赋值和引用变量 a=3 echo $a a="www.junmajinlong.com" echo $a a='hello world' echo $aShell中可以引用未定义的变量:
echo $xyzdefabc可以定义空变量:
a= echo $a 变量替换变量替换是指在命令开始执行前,Shell会先将变量的值替换到引用变量的位置处。
例如:
a="hello" echo $a world在echo命令开始执行前,Shell会取得变量a的值hello,并将它替换到命令行的$a处。于是,在echo命令开始执行时,命令行已经变成:
echo hello world除了变量替换,Shell还会做其它替换:
命令替换
进程替换
算术运算替换
大括号扩展
波浪号扩展
路径扩展
这些扩展和替换,都是Shell在调用命令之前就完成的,这和其它语言解析代码的方式不一样。
后面会详细解释Shell是如何做命令行解析的,如果不掌握命令行解析,当遇到命令行语法错误后很可能会花掉大量无谓的时间去调试命令。而掌握命令行解析后,就会对命令生命周期了如执掌,不敢说一次就能写对所有命令行,但能节省大量调试时间,对写命令行和写脚本的能力也会上升一个层次。
命令替换使用反引号或$()可以执行命令替换。
`cmd` $(cmd)命令替换是指先执行cmd,将cmd的输出结果替换到$()或反引号位置处。
例如:
echo `id root` echo $(id root)在echo命令执行前,会先执行id命令,id命令的执行结果:
$ id root uid=0(root) gid=0(root) groups=0(root)所以会将结果uid=0(root) gid=0(root) groups=0(root)替换$(id root)。于是,echo命令开始执行时,命令行已经变成了:
echo uid=0(root) gid=0(root) groups=0(root) 算术运算$[]或$(())或let命令可以做算术运算。
let是单独的命令,不能写在其它命令行中。
a=3 let a=a+1 echo $a$[]和$(())可以写在命令行内部,Shell在解析命令行的时候,会对它们做算术运算,然后将运算结果替换到命令行中。
a=33 echo $[a+3] echo $((a+3))因为变量替换先于算术替换,所以,使用变量名或引用变量的方式都可以:
a=333 echo $[$a+3] echo $(($a+3)) 退出状态码每个命令执行后都会有对应的进程退出状态码,用来表示该进程是否是正常退出。
所以,在命令行中,在Shell脚本中,经常会使用特殊变量$?判断最近一个前台命令是否正常退出。
通常情况下,如果$?的值:
为0,表示进程成功执行,即正常退出
非0,表示进程未成功执行,即非正常退出
但非0退出状态码并不一定表示错误,也可能是正常逻辑的退出
另外,在Shell脚本中,所有条件判断(比如if语句、while语句)都以0退出状态码表示True,以非0退出状态码为False。
exit命令exit命令可用于退出当前Shell进程,比如退出当前Shell终端、退出Shell脚本,等等。
exit [N]exit可指定退出状态码N,如果省略N,则默认退出状态码为0,即表示正确退出。
后台执行命令&在命令的结尾使用&符号,可以将这个命令放入后台执行。
命令放入后台后,会立即回到Shell进程,Shell进程会立即执行下一条命令(如果有)或退出。
使用$!可以获取最近一个后台进程的PID。
sleep 20 & echo $!使用wait命令可以等待后台进程(当前Shell进程的子进程)完成:
wait [n1 n2 n3 ...]不给定任何参数时,会等待所有子进程(即所有后台进程)完成。
sleep 5 & wait echo haha 多命令组合Shell中有多种组合多个命令的方式。
1.cmd1退出后,执行cmd2
cmd1;cmd22.cmd1正确退出(退出状态码为0)后,执行cmd2
cmd1 && cmd23.cmd1不正确退出后,执行cmd2
cmd1 || cmd24.逻辑结合:&&和||可以随意结合
# cmd1正确退出后执行cmd2,cmd2正确退出后执行cmd3 cmd1 && cmd2 && cmd3... # cmd1正确退出则执行cmd2,cmd1不正确退出会执行cmd3 # cmd1正确退出,但cmd2不正确退出,也会执行cmd3 cmd1 && cmd2 || cmd3 # cmd1正确退出会执行cmd3 # cmd1不正确退出会执行cmd2,cmd2正确退出会执行cmd3 cmd1 || cmd2 && cmd3