1. 变量表达式
-
test是shell程序中的一个表达式,通常用在流程控制for,while,until,if等结构中,用test命令去判断文件的存在与性质、变量的相互关系
-
语法:
test<表达式>
如果<表达式>成立,test返回0,反之返回一个非0值 -
字符串比较
-z<字符串>:比较字符串长度是否为0;如果等于0则为是,返回0
-n<字符串>:比较字符串的长度是否大于0;如果大于0则为是,返回0
<字符串1>=<字符串2>:比较两个字符串是否相同,相同为是,等号两边(是指等号的左边字符串和右边的字符串)要有空格是用==
<字符串1>!=<字符串2>:比较两个字符串是否相同,不同则为是
对以上四个命令的运行截图:
-
两个数值的比较
<数值表达式1><算符><数值表达式2>(算符两边要有空格)
-eq:两者相等;相等为是,返回0
-ne:两者不等;不相等为是,返回0
对以上两个命令的运行截图:
-lt:前者小于后者;小于为是,返回0
-le:前者小于或等于后者;小于等于为是,返回0
-gt:前者大于后者;大于为是,返回0
-ge:前者大于或等于后者;大于等于后者为是,返回0
对以上四个命令的运行截图:
-
逻辑操作,可以进行and/or,与其他条件联合使用
常用于逻辑测试的<表达式>有:
!<表达式>
:<表达式>不成立
<表达式1>-a<表达式2>
:<表达式1>与<表达式2>同时成立
<表达式1>-o<表达式2>
:<表达式1>或<表达式2>成立 -
文件操作,例如文件是否存在文件的状态等
文件测试表达式通常是为了测试文件的文件操作逻辑
-e:对象是否存在,存在返回值为0
-d:对象存在且为目录,则返回值为0
-f:对象存在且为文件,则返回0
-L:对象存在且为符号链接,返回值为0
-r:对象存在且可读,则返回0
-s:对象存在且长度非0,则返回0
-w:对象存在且可写,则返回0
-x:对象存在且可执行,则返回0
!:测试条件的否定。(与上述的符号用空格给隔开)
2. expr命令
expr是手工命令,用于求表达式变量的值
语法:expr 表达式的值
格式:exprexpression(命令读入expression参数,计算它的值,然后将结果写入标准输出)
参数应用规则:
1、用空格隔开每个项
2、用\(反斜杠)放在shell特定的字符前面
对包含空格和其他特殊字符的字符串要用引号括起来
3、计算字符串长度
格式:expr length “字符串”
4、增量计数
说明:expr在循环中用于增量计算,现将变量初始化为0,然后循环值加1,反引号的用法是命令替代
用法:
Loop=0
Loop=` expr $Loop + 1 `
3. shell流程控制语句
- 条件控制:if、case等结构
在shell中,条件判断语句可以使用if条件语句和case条件语句,case语句的选项比较多。
1、if条件语句
用法:
if<判别令>;
then{命令清单1}
then{命令清单2} //else语句可以省略
fi
- 此处判别令通常是test<表达式>,如果只写表达式,则用中括号括起来(中括号两边要有空格)
- 如果<判别令>返回0(对与test命令来说,就是其后的表达式成立),则将执行then后面的命令清单;反之,则执行else后的命令。
- shell语句中的分号
分号是多个语句之间的分隔符,当只有一个语句的时候,末尾无需分号,最后一个语句后面也无需分号。
eg:
if[asdfasdf];then //第一种写法
if[adsfads]
then // 第二种写法
if...
then...
else if...
then...
else if...
then...
...
fi
fi
fi
(1)[]、=、-o两边都要有空格,=也可以用==(=作为赋值符号时不能写成==)
(2)$ANSWER,N两边写不写引号无所谓
(3)if test $answer = N -o $answer =n
//if语句的第二种写法
举例:判断输入的分数是否及格
代码如下:
#!/bin/bash
#filename:ak
read -p "Input your score:" score
if [ $score -ge 60 ];then
echo "You passed!"
else
echo "You failed!"
fi
运行截图:
- case条件语句(猜拳游戏)
if条件语句用于在两个选项中选定一个选项,而case条件选择为用户提供了个根据字符串或变量的值从多个选项中选项一项方法
语法:
case<变量> in
<字符串1>){<命令清单1>};;
…
<字符串n>){<命令清单n>};;
*){其他命令};;
esac
在case运算式中也可以使用shell的通配符(“*”,“?”,“[]”) 通常用 “ * ”
作为case命令的最后运算式以便在前面找不到任何相应的匹配项时执行“其他命令”的命令
例子:
#!/bin/bash
#filename:case
case $1 in
China) echo Benjing;;
USA) echo Washington;;
British) echo London;;
Russia) echo Moscow;;
*) echo Out of my knowledge;;
esac
运行截图如下:
练习1:假如给出月份数字作为参数,就能编写写一个回送月份名的脚本month,输入不在0到12之间时,将得到错误信息
练习2:编写shell脚本cjpd,根据输入的学生成绩判断等级。当成绩>=90时为A级;当80<=成绩<90时为B级;当70<=成绩<80时为C级;当60<=成绩<70时为D级;当成绩<60时为E级