shell脚本
shell脚本:一直都在用,但是没有系统的学习过,只是在linux命令行模式敲一些简单的常用的指令,现在系统的学习一番。
一、创建shell脚本,一般以.sh结尾(linux下后缀只是种显示,没有任何具体含义)文件创建后需要chmod 0755 name 给它加上权限,之后就可以用./运行了
进入文件需要在最顶部加上shell脚本解释器,这个文件中的所有命令都会被bash拿到去解释。下面会说到shell的工作模式。
二、shell的工作模式;
我是这样理解的当我们在脚本中写这样一段程序的时候
#!/bin/bash ls
这个时候shell是这样去解释的,当前shell(bash)会fork一个子bash去获得这个脚本中的所有命令,然后到ls这一行的时候,sh会再fork一个新的bash去execv这个ls可执行程序,之后将等待的结果输出到当前终端上。
shell的命令分两种,一种是内部命令,一种是shell可执行的应用程序,当执行内部命令的时候frok的子bash就会在它的空间内执行这条命令。
三、shell脚本中的一些常见符号:
1>简单符号
1 #!/bin/bash 2 #shell中用#作为注释 3 count=1 #变量的定义不用声明类型,shell解释器会帮你去做 4 val=0 5 echo $count #$符号用来取变量的值 6 7 echo ${count}t #建议加上{}因为有时候你会像这样去输出 8 9 val=$(date) #$()的作用是命令替换,这行代码的意思就是将date的命令输出信息传给val 10 echo $val 11 12 val=`date` #``反引号的作用和$()一样都是命令替换,不同的是``中不能再用`` 13 echo $val 14 15 echo 'val' #''单引号的作用是保持字符串本身的意思,但它里面不能再有字符串了 16 17 echo "va'l'" # ""和单引号的不同在于它的里面可以有字符串'' 6,0-1 全部
2>意义符号
[ ]中括号的意思是一个判断语句注意[是一个命令所以后面要加空格,也可以用test命令。例如
19 val=10 20 21 test $val -eq 12 #test命令的书写格式,判断val的值是否等于12 22 echo $? 23 [ $val -eq 10 ] #[ ]命令的书写格式 24 echo $? 25 [ $val -eq 11 ] 26 echo $? 27 28 20,0-1 底端
echo $?的意思是拿到上一个执行语句的退出码,它的返回值成功为0失败为1。
3>shell下的比较命令;
-eq;等于
-ne;不等于
-lt;小于
-le;小于等于
-gt;大于
-ge;大于等于
另外的常用比较命令
-d 判断目录是则为真
-f 判断是文件则为真
逻辑与 -a [ $val -gt 10 -a $val -lt 100] 大于10小于100的数
逻辑或 -o [ $val -eq 10 -a $val -eq 100] 等于10或等于100的数
取反 ! [ $val -eq 10 -a $val -eq 100] 不等于10或不等于100的数
四、特殊变量
$0:相当于C语言main函数的argv[0]
$1、$2...
这些称为位置参数(Positional Parameter),相当于C语言main函数 的argv[1]、argv[2]...
$#
相当于C语言main函数的argc - 1,注意这里的#后面不表示注释
$@
表示参数列表"$1" "$2" ...,例如可以用在for循环中的in后面。
$?
上面已经提过
$$
显示当前shell的进程号
可以看出和c不同的地方在于,它的arcg->$#只输出不包括./这一列。
shift命令可以将位置左移,例如上面的程序加上shift 2后,$1的输出则是one了,shift 1为默认不移动的值
五、常见符号的区别
1> [[双中括号和[单中括号的区别
[[中可以用 == ! && || 正则表达式进行判断,但是上面的结果显然有问题,[[ 在&& ||判断的时候很难判断正确
2> ``与$()
#$()的作用是命令替换,这行代码的意思就是将date的命令输出信息传给val #``反引号的作用和$()一样都是命令替换,不同的是``中不能再用``
3> (())与let
(())和let都可以进行运算,基本可以互换的
((val++))
let val++
六、shell语法
while循环;
1 #!/bin/bash 2 3 val=0 4 while [ $val -lt 10 ] 5 do 6 echo $val 7 let val++ 8 done 9 #注意do done的书写 4,1 全部
if判断:
1 #!/bin/bash 2 3 val=10 4 5 if [ $val -eq 10 ]; 6 then 7 echo $val 8 fi 9 # if [] ; fi 的格式 5,1 全部
for语句:
两种写法
2 #写法一 3 val=0 4 5 for val in {0..100} 6 do 7 echo $val 8 done 9 #写法二 10 val=0 11 for (( val; val<=100 ;val++)) 12 do 13 echo $val 14 done 12,2 全部
switch case:
1 #!/bin/bash
2
3 read i
4
5 case $i in
6 a)
7 echo 'a'
8 ;;
9 b)
10 echo 'b'
11 ;;
12 esac
总结:shell脚本是类c风格的,shell的特点在于它有很多工具,这些工具会在后面的博客中详解。