linux shell script总结

在一些linux系统管理和自动化测试中经常需要写一些shell脚本,所以这里总结一下主要的规则,便于以后编写时查阅。
shell的开头必须以 #!/bin/bash开头,表明是使用/bin/bash来解释脚本的执行。 shell的注释用#
可以使用source命令来执行脚本,也可以直接将shell脚本文件加上可执行权限,直接执行
一:变量
1.定义变量 : aa=“qq” 注意等号两侧不能有空格(赋值的=两侧不能有空格)
2.特殊的自动变量:
$$ : 取当前进程的id,就是执行该脚本的进程的pid
$0 : 取当前文件名
$n : n是大于0的数字,n是几就是取第几个参数
$# : 取参数的个数
$* : 取所有的参数, 格式为“$1 $2 $3 ...”
$@ : 也是取所有的参数,格式为"$1" "$2" "$3"... 一般使用这个。
$? : 取命令的退出状态,0为没有错误,其实就是取该命令的main函数的return value。shell也可以有return value,可以在shell脚本中调用exit 0来返回value。 执行完后可以echo $?来查看return value
3.取变量的值,可以$aa,或者${aa}, 不能用()

二:数值的运算
1.由于shell的变量都是字符串,所以当要用到数值的计算时,不能简单的两个变量相加,如

a1=4
a2=2
a3=$a1+$a2
echo $a3

我们会发现输出的a3内容为"4+2", 是一个字符串。所以,要进行数值计算,必须要使用$((计算式))格式,如:

a1=2
a2=4
a3=$(($a1+$a2)) 
a4=$((4+3))  
echo $a3
echo $a4

这样输出的a3就是6. a4就是7.
数值运算符为 + - * / % 加减乘除 取余 bash shell只支持整数
2.数值关系运算符:
数值的关系运算也不能用简单的> < 等来运算,而是有特殊的运算符:
-eq 相等返回true
-ne 不相等返回true
-gt 大于返回true
-lt 小于返回true
-ge 大于等于返回true
-le 小于等于返回true

三: shell的布尔运算
!:取反运算 [!false]=true
-o :或运算 [$a -lt 20 -o $b -gt 100] a小于20 或者b大于100
-a : 与运算 [$a -lt 20 -a $b -gt 100] a小于20同时b大于100

四 shell字符串运算:
== 或者 = :判断两个字符串是否相等,前后需要空格。===功能是一样的,但前后都需要空格,与赋值要区别开,赋值=前后不能有空格。为了和赋值区分,我们建议这里使用==
!= : 判断两个字符串是否不相等 前后需要空格
-z : 检测字符串长度是否为0,是0返回true 比如: [-z $nane] 判断name字符串长度是否为0
-n : 检测字符串长度是否不为0,不为0返回true
[] :检测字符串是否为空,不为空返回true 如[ $a ]
字符串连接 : str=${str1}${str2},也可以str=$str1"--"$str2,结果就是str1–str2

五: shell文件测试运算符
-d file 检测文件是否为目录文件,目录返回true
-f file 检测文件是否为普通文件,普通文件返回true
-r file 检测文件是否可读
-w file 检测文件是否可写
-x file 检测文件是否可执行
-s file 检测文件大小是否为0,大于0返回true
-e file 检测文件是否存在,包含目录文件

六:shell的单引号和双引号的使用:
单引号中不能包含单引号,单引号中的转移字符\和变量$字符都会原样输出,无实际意义
双引号不能包含双引号,双引号的转移字符\$有实际意义,会取变量的值。

七 shell常用的通配符:
*: 匹配0或者多个字符
: 匹配任意一个字符
a[xyz]b:可匹配ab之间有xyz任何一个字符串,有且只有一个,也就是axb ayb azb这三种情况
a[!xyz]b 或者a[^xyz]b : ab之间只有一个字符,且非xyz中的字符。一般使用^来作为反向选择
a[1-9]: 匹配1-9中的任何一个,比如a1
a{abc,123}: aabc 或者a123
例子:

a=$(ls te[Ss]t.sh)
如果test.sh或者teSt.sh存在,则会赋值给a。

八: shell中的特殊字符
> : 输出重定向 ,比如cat 1.txt 2.txt > 3.txt会将1.txt和2.txt中的内容输入到3.txt中,如果3.txt已经存在,原来的内容会被覆盖
>> : 输出追加重定向,功能类似重定向,但是如果3.txt已经存在,不会覆盖原来的内容,会在原来的内容之后追加。
< : 输入重定向
: 命令分隔符,允许一行写多条命令
&& : 若前面一条执行成功,则执行下一条命令
|| : 前一条命令执行不成功,执行下一条命令
!4 : 执行history中的第4条命令

九: shell的数组操作
array=(a1 a2 a3) shell只支持一维数组
a[0]=1;a[2]=2 通过赋值的方式定义数组
数组的取值方式:
${数组名[index]} 如 : ${a[0]}
${a[*]} 和 ${a[@]} 都是取数组的所有元素
len=${#a[*]} 获取数组的长度

十. shell的if语法

if [ 条件成立 ];then      //注意if后面需要空格,“[”后和“]”前都需要空格
语句
elif [ 条件成立 ];then
语句
else
语句
fi
条件判断可以使用-o -a来同时判断多个条件,也可以使用|| 和&&,实例如下:
[ "$name" == "cc" -o  "$name" == “jj” ]  也可以写成["$name" == "cc" ] || ["$name" == "jj" ]  
&&也是一样的

十一 : shell的case判断

case 值 in
值1)
命令
;;   同break,跳出语句
值2)
命令
;;
*)
命令
;;
esac

例子:

a=$1
case $a in
”one“)
bash /usr/local/1.sh
;;
c)
touch /usr/local/2.sh
;;
*)
touch /usr/local/3.sh
;;
esac

十二:shell for循环
1.固定循环

for 变量 in 列表
do
命令
done
例子:
path='/root'
for file in $path/*
do
if [ -x $file -a -f $file]
then
echo $file
fi
done
例子2
for animal in dog cat elephant
do
echo "There are $(animal)s"
done

2.数值处理
for ((初始值;限制值;执行步长))
do
程序段
done
例子:

s=0
for ((i=1; i<101; i=i+1))
do
s=$(($s+$i))
done

十三: shell while循环

while [ condition ]
do
命令
done

还有一种until循环,如下

until [ condition ]
do
命令
done

这个和while循环相反,是condition为true时停止执行
例子:

while [ "$yn" != "yes" -a "$yn" != "YES" ]
do
read -p "Please input yes/YES to stop this program" yn
done
echo "success"
until为:
until[ "$yn" == "yes" -o "$yn" == "YES" ]
do
read -p "Please input yes/YES to stop this program" yn
done
echo "success"

十四: shell中的函数

function 函数名()
{
命令
return x
}
例子:
function show()
{
for file in $1/*.sh
do
echo $file
done
}
调用函数
show $1

因为shell是从上到下,从左到右执行的,所以定义的函数必须放在文件的开头,这样执行的时候才能找到。
函数内部也是有局部变量的,就是调用函数时传入的参数,所以在函数内部$0为函数名称,$1就是调用函数时传入的第一个参数,其他以此类推。
十五: 用户输入 read命令
read var 会提示用户输入,输入的信息会存在var变量中。

十六 :test命令和判断符号[ ]
他们的应用基本一样,比如
test -e ./1.txt && echo “exit” || echo “not exist” //判断1.txt是否存在,如果存在还会执行&&后面的语句,如果不存在,会执行 || 后面的语句
[ -e ./1.txt ] && echo “exit” || echo “not exist” //注意判断式的两边必须要有空格
使用中括号[ ]需要注意一下几个点:
1.在中括号内的每个组件都需要用空格键来分隔
2.在中括号内的变量,最好都用双引号括起来,比如[ “$name” == “ccjing” ]
3.在中括号内的常量,最好要以单引号或者双引号括起来
例子:

name="xiao ming"
[ $name == "xiao" ] || echo "not xiao ming"  
//这句话会报错,因为$name会替换为 xiao ming  结果就是 xiao ming == “xiao”  所以shell会报错,
//所以不管变量还是常量,最后都用引号括起来。

十七: 将shell命令的结果赋值给shell script的变量
var=$(command)
例如:date_second=$(date +%s) 就会得到现在的以秒为单位的日期。date命令可以参考date --help

下面列举一些shell script的例子:
1.输入一个日期,计算距离现在的天数

#!/bin/bash
read date_input
date_tmp=$(echo $date_input | grep '[0-9]\{8\}') #利用正则表达式来检查输入的格式是否是YYYYmmdd格式
if [ "$date_tmp" == "" ];then
echo "You input wrong date format"
exit1
fi
declare -i date_dem=$(date --date=$date_input +%s)  #定义一个整数型, 利用date命令来计算输入的日期的秒数
declare -i date_now=$(date +%s)  #计算现在时间的秒数
declare -i date_total_s=$(($date_dem-$date_now))  #计算差额
declare -i date_d=$(($date_total_s/60/60/24))  #将秒数换算为天
echo "The result is $date_d"

2.计算100的阶乘

#!/bin/bash
s=1
i=1
while [ "$i" != "101"]
do
s=$(($s*$i))
i=$(($i+1))
done
  1. 删除文件中包含某字符串的行
    可以参考sed命令,下面一句是将文件16-05-54.log文件中包含有“Animation and time”字符串的行都删除
#!/bin/bash
sed -i '/Animation and time/d' 16-05-54.log
  • 2
    点赞
  • 20
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值