文章目录
shell脚本学习
学习来源:《Linux就该这么学》
一、shell结构
第一部分.脚本声明:利用什么解释器运行 - #!/bin/bash
第二部分.脚本注释:描述脚本功能 - 以#号开头,可多行
第三部分.执行语句:需要执行的语句 - linux命令
shell.sh
#!/bin/bash 脚本声明
# For Example BY linuxprobe.com 脚本注释
pwd 执行命令
ls -al 执行命令
二、参数接收
1.接收命令行参数
$0对应的是当前Shell脚本程序的名称
$#对应的是总共有几个参数
$*对应的是所有位置的参数值
$?对应的是显示上一次命令的执行返回值
$1、$2、$3……则分别对应着第N个位置的参数值
$vim example.sh
#!/bin/bash
echo "当前脚本名称为$0"
echo "总共有$#个参数,分别是$*。"
echo "第1个参数为$1,第5个为$5。"
$bash example.sh one two three four five six
当前脚本名称为example.sh
总共有6个参数,分别是one two three four five six。
第1个参数为one,第5个为five。
2.接收用户输入-read
参数:
-t : 设置输入超时时间
-p: 设置输入时提示
$vim linuxread.sh
#!/bin/sh
#It's read.
read -t 5 -p "input :" name
echo "输入的名字是:$name。"
$bash linuxread.sh
input :basd
输入的名字是:basd。
三、测试语句
利用中括号包裹测试语句,返回逻辑值到$?,格式 : [ 测试语句 ]
按类型分为:文件测试语句
逻辑测试语句
整数值比较语句
字符串比较语句
1.文件测试
-d 测试文件是否为目录类型
-e 测试文件是否存在
-f 判断是否为一般文件
-r 测试当前用户是否有权限读取
-w 测试当前用户是否有权限写入
-x 测试当前用户是否有权限执行
$[ -d /etc/fstab ]
$echo $?
1
$[ -e /etc/fstab ]
$echo $?
0
2.逻辑测试
&&是逻辑“与”,只有当前面的语句执行成功的时候才会执行后面的语句。
||是逻辑“或”,只有当前面的语句执行失败的时候才会执行后面的语句。
!是逻辑“非”,代表对逻辑测试结果取反值;之前若为正确则变成错误,若为错误则变成正确。
$[ -d /etc/fstab ] && echo "yes" || echo "no"
no
$[ -e /etc/fstab ] && echo "yes" || echo "no"
yes
$[ ! -e /etc/fstab ] && echo "yes" || echo "no"
no
3.数值比较
操作符 | 作用 |
---|---|
-eq | 等于 |
-ne | 不等于 |
-gt | 大于 |
-lt | 小于 |
-ge | 大于等于 |
-le | 小于等于 |
$[ 10 -eq 10 ] # 等于
$echo $?
0
$[ 10 -gt 10 ] # 大于
$echo $?
1
$[ 10 -ge 10 ] # 大于等于
$echo $?
0
4.字符串比较
= 比较字符串内容是否相同
!= 比较字符串内容是否不同
-z 判断字符串内容是否为空
# 第一位上的$是linux命令交互的提示符
$string=''
$[ -z string ]
$echo $?
0
$string='string'
$[ $string = string ]
$echo $?
0
$[ $string = str ]
$echo $?
1
$[ $string != string ]
$echo $?
1
$[ $string != strin ]
$echo $?
0
四、流程控制
1.if条件分支
if条件语句的单分支结构由if、then、fi关键词组成,而且只在条件成立后才执行预设的命令,相当于口语的“如果……那么……”。
# 单分支
$vim pingfen.sh
#!/bin/bash
score=$1
if [ $score -ge 60 ]
then
echo '及格'
else
echo '不及格'
fi
$./pingfen 59
不及格
---------------------------------------
#多分支
$vim pingfen.sh
#!/bin/bash
score=$1
if [ $score -lt 0 ] || [ $score -gt 100 ]
then
echo '分数不合理'
elif [ $score -ge 90 ]
then
echo '优秀'
elif [ $score -ge 75 ]
then
echo '良'
elif [ $score -lt 60 ]
then
echo '不及格'
else
echo '及格'
fi
$./pingfen.sh -10
分数不合理
$./pingfen.sh 59
不及格
$./pingfen.sh 100
优秀
$./pingfen.sh 540
分数不合理
2.case条件分支
case 语句和 if…elif…else 语句一样都是多分支条件语句,不过和多分支 if 条件语句不同的是,case 语句只能判断一种条件关系,而 if 语句可以判断多种条件关系。
$vim testcase.sh
#!/bin/bash
case $1 in
"yes")
echo "o! yes!"
;;
"no")
echo "o! no!"
;;
*)
echo "It's error!"
;;
esac
$./testcase.sh yes
o! yes!
$./testcase.sh Yes
It's error!
3.for循环
for循环语句允许脚本一次性读取多个信息,然后逐一对信息进行操作处理。
$vim scorelist.txt
59
60
70
75
89
90
102
115
$vim pingfen.sh
#!/bin/bash
for score in `cat scorelist.txt`
do
if [ $score -lt 0 ] || [ $score -gt 100 ]
then
echo "$score 分数不合理"
elif [ $score -ge 90 ]
then
echo "$score 优秀"
elif [ $score -ge 75 ]
then
echo "$score 良"
elif [ $score -lt 60 ]
then
echo "$score 不及格"
else
echo "$score 及格"
fi
done
$./pingfen.sh
59 不及格
60 及格
70 及格
75 良
89 良
90 优秀
102 分数不合理
115 分数不合理
4.while循环
while条件循环语句是一种让脚本根据某些条件来重复执行命令的语句,它的循环结构往往在执行前并不确定最终执行的次数,完全不同于for循环语句中有目标、有范围的使用场景。
$vim Guess.sh
#!/bin/bash
PRICE=$(expr $RANDOM % 1000)
echo "商品实际价格为0-999之间,猜猜看是多少?"
TIMES=1
read -p "请输入您猜测的价格数目:" INT
while [ ! $INT -eq $PRICE ]
do
let TIMES++
if [ $INT -gt $PRICE ] ; then
echo "太高了!"
else
echo "太低了!"
fi
read -p "请输入您猜测的价格数目:" INT
done
echo "恭喜您答对了,实际价格是 $PRICE"
echo "您总共猜测了 $TIMES 次"
$./Guess.sh
./Guess.sh
商品实际价格为0-999之间,猜猜看是多少?
请输入您猜测的价格数目:500
太低了!
请输入您猜测的价格数目:750
太高了!
请输入您猜测的价格数目:600
太低了!
请输入您猜测的价格数目:650
太高了!
请输入您猜测的价格数目:625
太低了!
请输入您猜测的价格数目:635
太低了!
请输入您猜测的价格数目:642
太高了!
请输入您猜测的价格数目:639
太高了!
请输入您猜测的价格数目:636
太低了!
请输入您猜测的价格数目:637
太低了!
请输入您猜测的价格数目:638
恭喜您答对了,实际价格是 638
您总共猜测了 11 次