把学到sh脚本相关知识总结如下:
#!/bin/bash 注明用什么运行
#!/bin/sh
Chmod +xfilename 使得脚本有权限执行
变量名不需要定义,直接赋值使用双引号,lua脚本和sh脚本都是这样的,也可以使用语句赋值,需要使用单引号。
使用变量的时候需要加上${变量名},括弧是为了让解释器识别变量的边界值,赋值变量的时候不需要加上$。
Readonlyvar 使得var只读
Unsetvar 使得var 删除
Shell变量(shell程序设置的特殊变量),环境变量(所有程序包括shell启动的程序都可以访问环境变量),局部变量(当前脚本有效)。
单引号:单引号中的所有字符原样输出,变量无效
双引号:可以输出变量可以加上转移符
#变量名获得字符串的长度
Shell只支持一维数组
读取数组 &{数组名[下标]},*或者@可以获取数组中的所有元素
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
shell 只有单行注释#
执行的文件名:$0
第一个参数:$1
第n个参数:$n
传递到脚本的参数的个数:$#
以”$1$2..$n”的形式输出所有的参数$*
脚本运行的最后一个进程的iD:$$
后台运行的最后一个进程的ID:$!
$@ :与$*类似,在被双引号包起来的时候有所不同,”$*” 代表的是一个完整的值和“$@”代表的是所有参数个数个值,虽然这两个其实都是所有的参数。
$- :显示当前SHELL的环境变量,使用的选项,做过的修改什么的
$?:显示最后命令的退出状态。0表示没有错误,其他任何值表示有错误
运算符:
`expr 2+ 2`,两数之和,注意是反引号不是单引号,算数表达式之间要有空格
常用的运算方法如下:
假设变量a为10,变量b为20,*前必须加反斜杠\转义下才行
+ |
加法 |
`expr $a + $b` 结果为 30。 |
- |
减法 |
`expr $a - $b` 结果为 -10。 |
* |
乘法 |
`expr $a \* $b` 结果为 200。 |
/ |
除法 |
`expr $b / $a` 结果为 2。 |
% |
取余 |
`expr $b % $a` 结果为 0。 |
= |
赋值 |
a=$b 将把变量 b 的值赋给 a。 |
== |
相等。用于比较两个数字,相同则返回 true。 |
[ $a == $b ] 返回 false。 |
!= |
不相等。用于比较两个数字,不相同则返回 true。 |
[ $a != $b ] 返回 true。 |
-eq |
检测两个数是否相等,相等返回 true。 |
[ $a -eq $b ] 返回 false。 |
-ne |
检测两个数是否相等,不相等返回 true。 |
[ $a -ne $b ] 返回 true。 |
-gt |
检测左边的数是否大于右边的,如果是,则返回 true。 |
[ $a -gt $b ] 返回 false。 |
-lt |
检测左边的数是否小于右边的,如果是,则返回 true。 |
[ $a -lt $b ] 返回 true。 |
-ge |
检测左边的数是否大于等于右边的,如果是,则返回 true。 |
[ $a -ge $b ] 返回 false。 |
-le |
检测左边的数是否小于等于右边的,如果是,则返回 true。 |
[ $a -le $b ] 返回 true。 |
! |
非运算,表达式为 true 则返回 false,否则返回 true。 |
[ ! false ] 返回 true。 |
-o |
或运算,有一个表达式为 true 则返回 true。 |
[ $a -lt 20 -o $b -gt 100 ] 返回 true。 |
-a |
与运算,两个表达式都为 true 才返回 true。 |
[ $a -lt 20 -a $b -gt 100 ] 返回 false。 |
逻辑运算:
&& |
逻辑的 AND |
[[ $a -lt 100 && $b -gt 100 ]] 返回 false |
|| |
逻辑的 OR |
[[ $a -lt 100 || $b -gt 100 ]] 返回 true |
字符串运算
= |
检测两个字符串是否相等,相等返回 true。 |
[ $a = $b ] 返回 false。 |
!= |
检测两个字符串是否相等,不相等返回 true。 |
[ $a != $b ] 返回 true。 |
-z |
检测字符串长度是否为0,为0返回 true。 |
[ -z $a ] 返回 false。 |
-n |
检测字符串长度是否为0,不为0返回 true。 |
[ -n $a ] 返回 true。 |
str |
检测字符串是否为空,不为空返回 true。 |
[ $a ] 返回 true。 |
文件测试运算符
-b file |
检测文件是否是块设备文件,如果是,则返回 true。 |
[ -b $file ] 返回 false。 |
-c file |
检测文件是否是字符设备文件,如果是,则返回 true。 |
[ -c $file ] 返回 false。 |
-d file |
检测文件是否是目录,如果是,则返回 true。 |
[ -d $file ] 返回 false。 |
-f file |
检测文件是否是普通文件(既不是目录,也不是设备文件),如果是,则返回 true。 |
[ -f $file ] 返回 true。 |
-g file |
检测文件是否设置了 SGID 位,如果是,则返回 true。 |
[ -g $file ] 返回 false。 |
-k file |
检测文件是否设置了粘着位(Sticky Bit),如果是,则返回 true。 |
[ -k $file ] 返回 false。 |
-p file |
检测文件是否是有名管道,如果是,则返回 true。 |
[ -p $file ] 返回 false。 |
-u file |
检测文件是否设置了 SUID 位,如果是,则返回 true。 |
[ -u $file ] 返回 false。 |
-r file |
检测文件是否可读,如果是,则返回 true。 |
[ -r $file ] 返回 true。 |
-w file |
检测文件是否可写,如果是,则返回 true。 |
[ -w $file ] 返回 true。 |
-x file |
检测文件是否可执行,如果是,则返回 true。 |
[ -x $file ] 返回 true。 |
-s file |
检测文件是否为空(文件大小是否大于0),不为空返回 true。 |
[ -s $file ] 返回 true。 |
-e file |
检测文件(包括目录)是否存在,如果是,则返回 true。 |
[ -e $file ] 返回 true。 |
read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell变量:
read name
echo “$nameis a input”
显示命令执行结果:echo `date`
显示结果定向至文件:echo “…..” > myfile
Echo 自动换行,printf需要手动换行,printf可以和c语言一样的自定义字符格式
TEST命令
数值测试
-eq |
等于则为真 |
-ne |
不等于则为真 |
-gt |
大于则为真 |
-ge |
大于等于则为真 |
-lt |
小于则为真 |
-le |
小于等于则为真 |
字符串测试
= |
等于则为真 |
!= |
不相等则为真 |
-z 字符串 |
字符串的长度为零则为真 |
-n 字符串 |
字符串的长度不为零则为真 |
文件测试
-e 文件名 |
如果文件存在则为真 |
-r 文件名 |
如果文件存在且可读则为真 |
-w 文件名 |
如果文件存在且可写则为真 |
-x 文件名 |
如果文件存在且可执行则为真 |
-s 文件名 |
如果文件存在且至少有一个字符则为真 |
-d 文件名 |
如果文件存在且为目录则为真 |
-f 文件名 |
如果文件存在且为普通文件则为真 |
-c 文件名 |
如果文件存在且为字符型特殊文件则为真 |
-b 文件名 |
如果文件存在且为块特殊文件则为真 |
( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低。
cd /bin
if test -e ./notFile -o -e ./bash
then
echo '有一个文件存在!'
else
echo '两个文件都不存在'
fi
SHELL的流程控制
ifcondition then ..else..fi如果else分支没有语句执行,就不要写这个else。
elif 代表else if
for var in“….”
whilecondition
do
…
done
case语句
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
break和continue
break直接跳出所有循环,返回到shell提示符
continue 仅仅跳出当前循环,不会跳出所有的循环
SHELL函数:
funWithReturn(){
echo "这个函数会对输入的两个数字进行相加运算..."
echo "输入第一个数字: "
read aNum
echo "输入第二个数字: "
read anotherNum
echo "两个数字分别为 $aNum 和 $anotherNum !"
return $(($aNum+$anotherNum))
}
funWithReturn
echo "输入的两个数字之和为 $? !"
所有函数在使用前必须定义,函数的返回值在调用函数之后可以通过$?获得,所以一般都是先在shell脚本的前面写函数,最后面调用它
SHELL的输入输出重定向
command > file |
将输出重定向到 file。 |
command < file |
将输入重定向到 file。 |
command >> file |
将输出以追加的方式重定向到 file。 |
n > file |
将文件描述符为 n 的文件重定向到 file。 |
n >> file |
将文件描述符为 n 的文件以追加的方式重定向到 file。 |
n >& m |
将输出文件 m 和 n 合并。 |
n <& m |
将输入文件 m 和 n 合并。 |
<< tag |
将开始标记 tag 和结束标记 tag 之间的内容作为输入。 |
需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。
输出重定向:将命令的执行结果重定向到文件中
输入重定向:从文件直接获取输入
command << EOF
document
EOF
将document作为输入传递给command
不想输出结果: $ command > /dev/null
SHELL文件包含
. filename source filename 引用这个脚本
sh脚本获取命令的执行结果:
var = `cmd`