Shell脚本笔记
预备知识
shell脚本的2种执行方法
#方法一:进入当前脚本目录 chmod +x demo01.sh #给文件赋可执行权限 ./demo01.sh #方法二:直接运行解释器 sh demo01.sh
一、Shell变量
1)变量的命名规则:只支持数字、字母和下划线(_),首个字母不能以数字开头
2)变量名和等号之间不能有空格
3)变量名的赋值方式:显式赋值或通过语句给变量赋值
4)使用变量名:在变量名前加$符,可以给变量添加{},用于使解释器区分变量名的边界
#------------------------------------------------------ # #!是一个约定的标记,它告诉系统用什么解释器执行脚本 #------------------------------------------------------ #!/bin/bash message="Hello,world!" #显式赋值给变量 echo -e "$message\n" #使用变量$var -e 激活转义字符 for skill in ECMA JAVA;do #通过语句给变量赋值1 echo "I'm good at ${skill}Script" #使用变量${var} done for file in `pwd`;do #通过语句给变量赋值2 echo -e "\n$file\n" done for file in $(ls /etc | grep sh);do #通过语句给变量赋值3 echo $file done
执行结果:

5)只读变量:使用readonly可以将变量定义为只读变量,只读变量的值不能被改变
#!/bin/bash name="姬满广" readonly name name="唐波"
执行该shell脚本结果如下:

6)删除变量:使用unset可以删除变量
name="刘建慧" unset name echo $name
执行该shell脚本结果为不打印name值,如下图所示:

7)变量类型:包括全局变量与局部变量
--全局变量(环境变量)
--i)查看全局变量的方法:env 或 export -p 命令
--ii)定义全局变量的方法:
export variable_name=value #export只对当前登录有效 或 variable_name=value export variable_name
二 字符串和数组
1)字符串
--字符串支持单引号与双引号,也可以不用引号
--单引号字符串的限制:
--任何字符都会原样输出,单引号字符串中的变量是无效的
--不能出现一个单独的单引号(使用单引号的转移字符也不行),但可成对出现,作为字符串拼接使用
相对应的
--双引号字符串支持变量
--双引号里可以出现单个的转义字符
--字符串拼接:可使用单引号或双引号拼接
--获取字符串长度:${#str}
--提取子字符串:${str:start:len} #从1开始,获取从start开始的len个字符
--查找子字符串:expr index str substr #substr可以是多个字符,能匹配substr中的任意一个即
#!/bin/bash name="Lucy" message1="Hello,I know your name is $name\n" #双引号字符串支持变量 message2="Hello,I know your name is "$name"\n" #双引号字符串拼接 message3='Hello,I know your name is $name\n' message4='Hello,I know your name is '$name'\n' #单引号字符串拼接 echo -e $message1 echo -e $message2 echo -e $message3 echo -e $message4 echo -e "name.length = "${#name}"\n" #字符串长度获取 echo -e ${name:1:2}"\n" #截取变量中的子字符串 echo `expr index "$name" L` #查询字符位置
执行结果:
2)数组
--bash支持一维数组(不支持多维数组)
--bash不限制数组的大小
--数组的定义:用“空格”符号分隔开
--数组的索引:自0开始
array_name=(value0 value1 value2 ... valuen)
或者
array_name=(
value0
value1
value2
...
valuen
)
--读取数组: ${array_name[n]} # n=0,1,2,......,n-1
--获取数组中的所有元素:${array_name[*]} 或 ${array_name[@]}
--获取数组的长度
--获取数组的长度:${#array_name[*]} 或 ${#array_name[@]}
--获取单个数组的长度:${#array_name[n]}
#!/bin/bash array1=("我" "们" "的" "祖" "国" "是" "花" "园") array2=( 花 园 的 花 朵 真 鲜 艳 ) echo -e ${array1[7]}"\n" #获取单个元素 echo -e ${array2[7]}"\n" #获取单个元素 echo -e "array1长度:"${#array1[*]}"\n" #获取数组长度 echo -e "array2长度:"${#array2[@]}"\n" #获取数组长度 echo -e ${#array1[1]}"\n" #获取单个字符的长度 echo -e "array1元素:"${array1[*]}"\n" #获取数组中的所有的元素
执行结果:

三、传参
--在执行shell脚本时,可以向脚本传递参数,脚本内获取参数的格式:$n。n代表一个数字,1标识执行脚本的第1个参数,2表示执行脚本的第2个参数,依此类推...
--需要注意的是,$10不能获取第10个参数,当n>=10时,获取参数需要使用${n}来实现
--$0表示执行的文件名

#/bin/bash echo -e "执行的文件名:$0\n" echo -e "传递的参数个数:$#\n" echo -e "第一个参数为:$1\n" echo -e "第二个参数为:$2\n" echo -e "第三个参数为:$3\n" echo -e "脚本运行的当前进程ID号:$$\n" echo -e "脚本运行的最后一个进程的ID号:$!\n" echo '通过带引号的$*循环输出参数:' for i in "$*";do echo $i done echo -e "\n" echo '通过$*循环输出参数:' for i in $*;do echo $i done echo -e "\n" echo '通过带引号的$@循环输出参数:' for i in "$@";do echo $i done echo -e "\n" echo '通过$@循环输出参数:' for i in $@;do echo $i done echo -e "\n" echo '通过$*输出参数:' echo "$*" echo -e "\n" echo '通过$@输出参数:' echo "$@" echo -e "\n"
执行结果:

四、Shell运算符
--表达式和运算符之间要有空格,如:2 + 2 //不能写成2+2
--算数运算符

a=10 b=20 echo -e "a = $a,b = $b\n" val=`expr $a + $b` echo -e "a+b = $val\n" val=`expr $b - $a` echo -e "b-a = $val\n" val=`expr $a \* $b` echo -e "a*b = $val\n" val=`expr $b / $a` echo -e "b/a = $val\n" val=`expr $b % $a` echo -e "b%a = $val\n" a=$b #赋值 echo -e "a=$a b=$b\n" if [ $a == $b ] then echo "a等于b" fi if [ $a != $b ] then echo "a不等于b" fi
执行结果:

--关系运算符

#/bin/bash #author:wanwaytech a=10 b=20 echo -e "a=$a, b=$b\n" if [ $a -eq $b ] then echo "$a -eq $b :a等于b" else echo "$a -eq $b : a不等于b" fi if [ $a -ne $b ] then echo "$a -ne $b : a不等于b" else echo "$a -ne $b :a等于b" fi if [ $a -gt $b ] then echo "$a -gt $b : a大于b" else echo "$a -gt $b : a小于等于b" fi if [ $a -lt $b ] then echo "$a -lt $b : a小于b" else echo "$a -lt $b : a大于等于b" fi if [ $a -ge $b ] then echo "$a -ge $b : a大于等于b" else echo "$a -ge $b : a小于b" fi if [ $a -le $b ] then echo "$a -le $b : a小于等于b" else echo "$a -le $b : a大于b"
执行结果:

--布尔运算符

--逻辑运算符

#!/bin/bash a=10 b=20 if [ $a -gt 0 -a $a -lt 100 ] then echo "a>0且a<100:true" else echo "a>0且a<100: false" fi if [ $b -le 0 -o $b -ge 100 ] then echo "b<=0或b>=100:true" else echo "b<=0或b>=100: false" fi if [[ $a -gt 0 && $a -lt 100 ]] then echo "a>0且a<100:true" else echo "a>0且a<100: false" fi if [ $b -le 0 ] || [ $b -ge 100 ] then echo "b<=0或b>=100:true" else echo "b<=0或b>=100: false" fi
执行结果:

--字符串运算符

#!/bin/bash a="abc" b="efg" if [ $a = $b ] then echo "$a = $b:a等于b" else echo "$a = $b:a不等于b" fi if [ $a != $b ] then echo "$a != $b:a不等于b" else echo "$a != $b:a等于b" fi if [ -z $a ] then echo "-z $a:字符串长度为0" else echo "-z $a:字符串长度不为0" fi if [ -n $a ] then echo "-n $a:字符串长度不为0" else echo "-n $a:字符串长度为0" fi if [ $a ] then echo "$a:字符串不为空" else echo "$a:字符串为空" fi
执行结果:

五、echo命令与printf命令
1)echo命令
--显示不换行 echo -e "XXX\c" # \c: 不输出后面的字符 不换行
echo -n “XXX” #不换行输出
eg.echo -e "我们\c很好" #输出我们
--显示结果定向至文件 > >>
eg. echo "Hello test" > 1.txt #覆盖写
echo "Hello test" >> 1.txt #追加写
2)printf命令
--printf format-string [arguments ...] #format-string:格式控制符 arguments:输出参数
--格式控制符

六、流程控制
1、if语句
--if [elif else]语句 #elif与else均非必要
#!/bin/bash a=10 b=20 if [ $a == $b ] then echo -e "a等于b" elif [ $a -gt $b ] then echo -e "a大于b" else echo -e "a小于b" fi
执行结果:

2、for循环
#!/bin/bash for loop in 1 2 3 4 5 do echo $loop done
#!/bin/bash for((i=1;i<=5;i++)) do echo $i done
执行结果:

3、while语句
#!/bin/bash a=1 while (($a <= 5)) do echo $a let "a++" done
执行结果:

七、函数
--shell中函数的定义格式如下:
[function] funname [()]{
action;
[return int;]
}
--可以带function funname()定义,也可以直接funname()定义,不带任何参数
--参数返回,可以显示如:return 返回,如果不加,将以最后一条命令运行结果,作为返回值
--函数返回值在调用函数后通过$?来获得
--$?仅对其上一条指令负责,一旦函数返回后其返回值没有立即保存入参数,那么其返回值将不再通过$?获得
#!/bin/bash function add(){ echo "求和运算" echo "请输入第一个数字:" read aNum echo "请输入第二个字符:" read bNum return `expr $aNum + $bNum` } add echo "和为:$?" function sub(){ echo "减法运算" echo "请输入第一个数字:" read aNum echo "请输入第二个数字:" read bNum return `expr $aNum - $bNum` } sub echo "差为: $?"
执行结果:

#!/bin/bash function test(){ echo "参数个数$#" echo "第一个参数是$1" echo "第二个参数是$2" echo "第十个参数是${10}" } test 1 2 3 4 5 a 7 9 13 21 77 32 11
执行结果:

八、文件包含
--文件包含方法
. filename #注意点号(.)和文件名中间有一空格
或
source filename
--demo20.sh #!/bin/bash url="http://www.baidu.com" --demo21.sh #/bin/bash #. ./demo20.sh source demo20.sh echo "百度网址:$url"
执行结果:


浙公网安备 33010602011771号