Shell脚本深入教程(1):快速入门

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 $a

Shell中可以引用未定义的变量:

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;cmd2

2.cmd1正确退出(退出状态码为0)后,执行cmd2

cmd1 && cmd2

3.cmd1不正确退出后,执行cmd2

cmd1 || cmd2

4.逻辑结合:&&和||可以随意结合

# 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

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zzwzjd.html