linux条件测试操作(test)和if判断语句,while循环语句,break控制语句和for循环和case多分枝语句和select语句
条件测试操作
条件测试是专为影响"$?"的操作,是条件转移、循环语句的基础
test测试命令:
test
用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他非0数值($?)。
格式:test 条件表达式
[ 条件表达式 ]
功能:检查文件和比较值
test表达式类型分为四类
常见的测试类型
①测试文件状态
②整数值比较
③字符串比较
④逻辑测试
1)文件测试判断格式:
test 操作符 文件
[ 操作符 文件或目录 ]
常用的测试操作符
文件名,文件类型
-d file 如果文件为一个目录,则为真(文件目录)
-e file如果文件存在,则为真(文件存在)
-f file 如果文件为一个普通文件,则为真(普通文件)
-b file 如果文件为一个块特殊文件,则为真(块设备)
-c file 如果文件为一个字符特殊文件,则为真(字符设备文件)
-L file 同-h,测试是否为符号链接 软连接(link)文件(软连接)
文件权限检测
-r file 如果文件可读,则为真(文件可读)
chmod o-r file
-w file 如果文件可写,则为真(文件可写)
-x file 如果文件可执行,则为真(文件执行)
-O file 如果文件存在并且归该用户所有,则为真(用户)
-G file 如果文件存在且归该组所有,则为真(组)
-g file 如果设置了文件的 SGID 位,则为真(SGID)
-u file 如果设置了文件的 SUID 位,则为真(SUID)
chmod u+s file
chgrp stual abcd.err 改所属用户组
2)字符串测试比较 格式:
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
常用的测试操作符 案例
=:字符串内容相同 (==)
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
-n: 字符串内容非空
\>: 字符串1大于字符串2
\<: 字符串1小于字符串2
test –n 字符串 字符串的长度非零(非空)
val=“asda”
test -n $val
echo $?
0
test –z 字符串 字符串的长度为零(为空)
var=3 var
test -z $var test -z $var
echo $? echo $?
0 1
test 字符串1 = 字符串2 字符串相等(相等)
test 字符串1 != 字符串2 字符串不等(不等)
test 字符串 \> 字符串2 字符串1大于2(大于)
\ 转义字符,是为区分输入重定向,和输出重定向
test 字符串 \< 字符串2 字符串1小于2 (小于)
Var=3 var
test -z $var test -z $var
echo $? echo $?
0 1
3)整数值比较测试 格式 只能整数值比较
格式:
[ 整数1 操作符 整数2 ]
常用的测试操作符 案例
-eq 判断是否相等 (equal)
-ge 判断是否大于等于 (greater than or equal)
-gt 判断是否大于 (greater than)
-le 判断是否小于等于 (less than or equal)
-lt 判断是否小于 (less than)
-ne 判断是否不等于 (not equal)
Var=3
Test $var -eq 1 判断是否相等
或者
[ var -eq 1] 然后echo $? 查看是否为0,0则为真
test 文件1 –ge 整数2 文件1大于等于整数2
test 文件1 –gt 整数2 文件1大于整数2
test 文件1 –le 整数2 文件1小于等于整数2
test 文件1 –lt 整数2 文件1小于整数2
test 文件1 –ne 整数2 文件1不等于整数2
4.)判断表达式
if test (表达式为真)
if test ! 表达式为假 !取反 -a 与 -o 或
test 表达式1 –a 表达式2 两个表达式都为真
test 表达式1 –o 表达式2 两个表达式有一个为真
1.算数表达式的逻辑测试
((算数表达式))
例如:
((2-1)) echo $? 0
((2-2)) echo $? 1
算数表达式的结果不为0,逻辑结果为真,($?=0),
算数表达式的结果为0,逻辑结果为“假”,($?=0),
2.逻辑测试 格式
[ 表达式1 操作符 表达式2 ] ...
常用的测试条件的逻辑操作符 案例
!逻辑非(NOT),它放在任意逻辑表达式之前,使原来的表达式由真变假,或者由假变真。
例如:
[ ! -r $1 ]
另一种写法
!test -r “$1” 这句相当于说$1的内容非可读才是真
-a 逻辑与,“而且”的意思,
前后两个表达式都成立时整个测试结果才为真,否则为假
例如:
[ -f “$myfile” -a -r “$myfile” ] $myfile即是文件又可读才是真,否则为假
-o 逻辑或,“或者”的意思
操作符两边至少一个为真时,结果为真,否则结果为假
例如:
[ “$a” -ge 0 -o “$b” -le 100] 假如$a=5整个结果就是真了。有一个为真就是真
()圆括号,把一个逻辑表达式括起来,使之优先得到运算,缺省下-a 的优先级高于-o,()可以改变这种优先级
-a 逻辑与 而且 ----两个表达式都为真
例如:
[ -f abc.err -a -d my_dir1]
文件 与 目录
或者
test -f abc.err -a -d my_dir1
test 表达式1 –a 表达式2 两个表达式都为真
[ -f abc.err -a -d my_dir1]只能在[] 里面写参数,
! 逻辑非 取反 使原来的表达式由真变假,或者由假变真。
[ -f abcd.err ] echo $? 0
[ ! -f abcd.err ] echo $? 1
-o 逻辑或 两个表达式有一个为真
test 表达式1 –o 表达式2 -----两个表达式有一个为真
[ ! \( -f abc.err -o -d my_dir1 \ ) -a -b /dev/sda]
!取反 反义
第十四天判断语句
If格式
if [ 条件判断 ];
then ---判断条件是否成立,若成立,执行代码,
格式:
[ ]; 前后必须有空格
命令块 --直接写命令,在同一行分号隔开:
fi 结束
(1)格式1判断条件 -gt lt eq ge le ne f d l b快设备 c字符设备 案例
[ $shu -gt 80 ]; -gt 大于 -lt 小于 -eq 等于 -ge 大于等于 -le 小于等于 -ne 不等于
[ $name = "zhang" ];---用 = 做字符的判断 注:=左右无空格表示赋值功能,=左右有空格表示判断功能
[ -f "/mnt/f1 " ]; --- -f判断是否是文件或文件是否存在 -d 判断目录 -l 判断软链接 -b 块设备 -c 字符设备
[ -r "/mnt/f1" ]; --- -r判断是否有读权限 -w 判断写权限 -x 判断执行权限
[ -z $shu ]; --- -z判断变量值是否为空,若为空,则判断结果成立
[ 条件1 -a 条件2 ]; --- -a表示and,即与运算 -o 表示or,即或运算
例:
[ $age -ge 20 -a $age -le 35 ];
[ ! 条件 ]; --- ! 表示取反值
案例:
read -p "Pls input Your choice(number):" var1
if [ "$var1" -gt 4 ]
then
echo "Value is out of range "
fi
(2)格式2: if then 案例
if [ 条件判断 ];
then ---条件满足执行代码1,不满足执行代码2
//代码1
else
//代码2
fi
read -p "Pls input Your choice(number):" var1
if [ "$var1" -gt 4 ];
then
echo "Value is out of range "
else
echo "you input is $var1"
fi
(3)格式3:
if [ 条件1 ];
then ---条件1满足执行代码1,
//代码1
elif [ 条件2 ];
then --- 否则,条件2满足执行代码2
//代码2
elif [ 条件3 ];
then --- 否则,条件3满足执行代码3
//代码3
else
//代码4 ---之前所有条件都不满足
Fi
注:多级判断时,判断条件的先后顺序
#先判断条件1,如果为真则执行条件elif2,3,,如果条件1为假则执行else
案例:
read -p "Pls input Your choice(number):" var1
if [ "$var1" -le 4 ];
then
echo "you input is haha"
elif [ $1 -eq 5 ]
then
echo "your input is 5"
elif [ $1 -eq 6 ]
then
echo "input is 6"
elif [ $1 -eq 7 ]
then
echo "input is 7"
else
echo "you input is out of rang"
fi
注意
[root@centos7 ss]# ./if
Pls input Your choice(number):4
you input is haha
[root@centos7 ss]# ./if 7 ---因为比4大,所以输入5是,会输入这个7
Pls input Your choice(number):5
input is 7
[root@centos7 ss]#
2.)循环语句while格式 案例
功能:重复性执行某个操作
while [ 条件判断 ]
do
命令1
命令2
....(//代码)
命令n
done
执行过程:条件=>代码=>条件=>代码=>...=>直到条件不满足
循环四要素:初值 条件 循环体 变量更新,避免:无循环 死循环
案例
1)计算1-100之间各数之和
sum=0 #----定义变量
shu=1 #----定义变量
while [ $shu -le 100 ]; #----shu小于100
do
let sum=$sum+$shu #----累加
let shu=$shu+1 #---原来值+1,再去循环是否小于100,是就接着循环
done #----表示结束
echo $sum #---输出sum
2)计算任意数的和(从1开始)
sum=0 #----初始值总和为0
shu=1 #----数为1
read -p "Pls input a number:" var #----请输入一个数 var表示任意变量
while [ $shu -le $var ]; #----比较shu是否小于等于var变量
do
let sum=$sum+$shu #sum为sum+shu ,新值
let shu=$shu+1
done
echo $sum
3)计算1-100间3的倍数之和
sum=0
shu=1
while [ $shu -le 100 ];
do
let yu=$shu%3 #--余数=shu%3
if [ $yu -eq 0 ]; then #---余数=0时,然后下一步
let sum=$sum+$shu #--接着相加,不为0时fi结束
fi
let shu=$shu+1
done
echo $sum
:字符串
jiXu="y" #--- 继续=yes
while [ $jiXu = "y" ]; #-- 条件为真
do
echo "上午上课"
echo "下午实验"
echo "晚上自习"
read -p "明天继续吗?y/n:" jiXu
done
3.)循环控制语句break 格式案例
break [n] 停止、跳出循环
continue 停止本次循环,跳入下一次循环
While [条件判断]
do m1
命令块 m2
continue 中断循环,开新的循环
m3 不运行了
done
案例
1)计算1-100之间各数之和,求加到几的时候,和超过1000
shu=1
sum=0
while [ $shu -le 100 ];
do
let sum=$sum+$shu ---循环相加求和
if [ $sum -ge 1000 ]; then
break
fi
let shu=$shu+1
done
echo shu=$shu sum=$sum
2)计算1-100间3的倍数之和
shu=1
sum=0
while [ $shu -le 100 ];
do
let yu=$shu%3
if [ $yu -ne 0 ]; ---查看余数是否不等于0
then
let shu=$shu+1
continue
fi
let sum=$sum+$shu
let shu=$shu+1
done
4.)for循环格式 案例
for 变量 in 值1 值2 值3 ... ---把后面给定的值,依次赋值给变量,带入代码执行
do
//代码
Done
缺点:for不支持做范围的指定
案例
1 )计算1-10之间各数之和
sum=0
for shu in 1 2 3 4 5 6 7 8 9 10
do
let sum=$sum+$shu
done
echo $sum
5.)多分支语句case格式 案例
case $变量 in ---根据变量的值,找到下面对应的值项,运行对应代码
值1) 代码1 ;; --- ;; 表示本项代码的结束
值2) 代码2 ;;
值3) 代码3 ;;
*) 代码4 ;; --- *项,表示给定的值与变量的值都不匹配时,执行*项
esac
案例
case $1 in
*[!0-9]* ) echo "The first is not a number" ---不是0-9,输出3
exit 3
;;
* ) echo "The first is number! value is $1" ---是数字,输出 0
exit 0
;;
esac
[root@centos7 ss]# ./zz
The first is number! value is
[root@centos7 ss]# ./zz aa2
The first is not a number
[root@centos7 ss]# ./zz 123
The first is number! value is 123
[root@centos7 ss]# echo $?
0
[root@centos7 ss]# ./zz aaa
The first is not a number
[root@centos7 ss]# echo $?
3
6.)选择语句select格式 案例
select 变量 in 值1 值2 值3 ... ---把后面给定的值,当做菜单显示,根据人为的选择,把对应的值赋值给变量,带入代码
do
//代码
break --- 跳出本结构,若不写break,则循环选择
done
特殊应用
userName=`awk -F ":" '{print $1}' /etc/passwd` ; echo $userName
注:给变量赋值时,变量值中不支持回行,多行的值,赋给变量,也是一行存储的
7.)read格式
一行内容格式案例
read hang < /mnt/f1 ---读取文档中的第一行文字,赋值给变量
[root@centos7 ss]# vi f1
bcd 1234 adas
dasdas
55566 kkss
sdkja\skd 0099 kkk
~
---------编辑f1 文件
[root@centos7 ss]# echo $f1
bcd 1234 adas ---输出第一行
全部输出 格式案例
while read hang ---逐行读取文档的内容,每次读取一行,赋值给变量,带入代码中
do
echo $hang
done < /mnt/f1
案例
[root@centos7 ss]# while read var ---输出全部
> do
> echo $var ---输出全部
> done <f1
bcd 1234 adas
dasdas
55566 kkss
sdkjaskd 0099 kkk
[root@centos7 ss]# while read var
> do
> echo $var
> echo $var |grep 555
> if [ $? -eq 0 ] ;then
> break ---Break跳出,提取
> fi
> done < f1 ----从f1 里面读取
bcd 1234 adas
dasdas
55566 kkss
55566 kkss
读取字段 格式 案例
while read c1 c2 c3 ---逐行读取文档的内容,每次读取一行,把该行的各列的值,赋值给对应的变量
do c1 c2 c3 为多个变量
echo $c2
done < /mnt/f2
案例
[root@centos7 ss]# vi f1 ---编写vi
bcd 1234 adas
dasdas
55566 kkss
sdkja\skd 0099 kkk
~
[root@centos7 ss]# while read var1 var2 var3 ---var1,var2 读取第几行
> do
> echo $var2 -----输出第二行
> done <f1 ----从f1 里面读取
1234
kkss
0099
8.)函数编写 格式 案例
函数编写---又称方法
功能:在shell脚本中,编写一段独立的代码,完成一个小功能。被正常的代码所调用
目的:被多次执行的相同代码,写到函数中,被多次调用即可,无需把代码写好多遍,简化代码量
定义格式:
当成命令来使用,不用写vi,# 下写就行
function 函数名( ) { --函数名后一定有圆括号,function关键词可省略
//代码 shell ()无东西
}
或
函数名( ){
//代码
}
( )子shell { }当前shell
定义函数后可以当命令来使用
案例
求1-n之间各数之和
function qiuHe(){ -----qiuHe是定义的函数
read -p "请输入要累加到的数字:" n
sum=0
shu=1
while [ $shu -le $n ];
do
let sum=$sum+$shu ---可以echo $sum和$shu 查看
let shu=$shu+1 当前shell可知
done
echo $sum
}
echo then is sum of 1 - n: #
qiuHe ---代码中直接写函数名,即可实现函数调用
9.)参数传递
函数在运行时,需要调用方给其提供素材性数据,以参数传递的形式完成
定义格式:
在函数代码中,以 $n 的格式使用参数,n表示编号,从1开始计数
调用格式:调用方按照函数所需参数的个数,调用时,在函数名后一一列举
案例 求和累加
function qiuHe(){
sum=0
shu=1
while [ $shu -le $1 ];
do
let sum=$sum+$shu
let shu=$shu+1
done
echo $sum
}
echo "请输入要累加到的数字"
read n
echo 1- $n 的累加和是:
qiuHe $n ---调用函数,并传递参数
案例 求减法
function qiuJianFa(){
let cha=$1-$2
echo $cha
}
echo "请输入要第一个数字"
read n1
echo "请输入要第二个数字"
read n2
qiuJianFa $n1 $n2
10.)返回值格式
函数运行完毕,携带结果数据,返回调用方
格式: 函数中,用return指定返回的值,调用方代码中,调用后,用$?的格式去使用返回值,注:返回值只能有一个
1.案例
function qiuJianFa(){
let cha=$1-$2
return $cha
}
echo "请输入要第一个数字"
read n1
echo "请输入要第二个数字"
read n2
qiuJianFa $n1 $n2
echo 两数相减的差为:$?
注意:脚本代码中函数的定义语句必须写在调用语句之前
脚本中可以编写参数调用,人为再运行脚本时,给其传递参数
2.案例.返回值
返回值 return 返回
# function fanhui (){
> if [ $1 -lt 5 ] #---如果输入的$1 小于5
> then
> echo you #---则输出 you
> return 1 #--- echo $? 查看是回复 1
> elif [ $1 -gt 10 ] #--或者 输入的$1 大于10
> then
> echo wo #--输出 wo
> return 2 #-- echo $? 查看是回复 2
> else #--其他情况则输出wbzd
> echo wbzd
> return 0 #--- echo $? 查看是回复 0
> fi # --结束
注意 # type fanhui 可查看内容
# fanhui 加数字可使用 ----定义函数可以当作命令
11.)案例 命令保存到 函数库 格式 vi .bash _profile
想要保存 保存在函数库里,
1.先写一个vi 把函数命令保存在里面: vi fu
2.然后设置权限: chmod a+x fu
3.要使每次开机运行它,
写入 vi .bash _profile
在 export PATH 下加入自己的文件
如:
. /root/fu --- . 表示当前shell /root/fu 为路径
案例
# function fanhui (){
> if [ $1 -lt 5 ] #---如果输入的$1 小于5
> then
> echo you #---则输出 you
> return 1 #--- echo $? 查看是回复 1
> elif [ $1 -gt 10 ] #--或者 输入的$1 大于10
> then
> echo wo #--输出 wo
> return 2 #-- echo $? 查看是回复 2
> else #--其他情况则输出wbzd
> echo wbzd
> return 0 #--- echo $? 查看是回复 0
> fi # --结束
vi fu
将内容写进去
然后
chmod a+x fu
vi . bash _profile在export PATH 下写入
. /root/fu
exit ---退出
然后
fanhui 5 ---$1 变量 为5
条件测试操作
条件测试是专为影响"$?"的操作,是条件转移、循环语句的基础
test测试命令:
test
用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他非0数值($?)。
格式:test 条件表达式
[ 条件表达式 ]
功能:检查文件和比较值
test表达式类型分为四类
常见的测试类型
①测试文件状态
②整数值比较
③字符串比较
④逻辑测试
1)文件测试判断格式:
test 操作符 文件
[ 操作符 文件或目录 ]
常用的测试操作符
文件名,文件类型
-d file 如果文件为一个目录,则为真(文件目录)
-e file如果文件存在,则为真(文件存在)
-f file 如果文件为一个普通文件,则为真(普通文件)
-b file 如果文件为一个块特殊文件,则为真(块设备)
-c file 如果文件为一个字符特殊文件,则为真(字符设备文件)
-L file 同-h,测试是否为符号链接 软连接(link)文件(软连接)
文件权限检测
-r file 如果文件可读,则为真(文件可读)
chmod o-r file
-w file 如果文件可写,则为真(文件可写)
-x file 如果文件可执行,则为真(文件执行)
-O file 如果文件存在并且归该用户所有,则为真(用户)
-G file 如果文件存在且归该组所有,则为真(组)
-g file 如果设置了文件的 SGID 位,则为真(SGID)
-u file 如果设置了文件的 SUID 位,则为真(SUID)
chmod u+s file
chgrp stual abcd.err 改所属用户组
2)字符串测试比较 格式:
[ 字符串1 = 字符串2 ]
[ 字符串1 != 字符串2 ]
常用的测试操作符 案例
=:字符串内容相同 (==)
!=:字符串内容不同,! 号表示相反的意思
-z:字符串内容为空
-n: 字符串内容非空
\>: 字符串1大于字符串2
\<: 字符串1小于字符串2
test –n 字符串 字符串的长度非零(非空)
val=“asda”
test -n $val
echo $?
0
test –z 字符串 字符串的长度为零(为空)
var=3 var
test -z $var test -z $var
echo $? echo $?
0 1
test 字符串1 = 字符串2 字符串相等(相等)
test 字符串1 != 字符串2 字符串不等(不等)
test 字符串 \> 字符串2 字符串1大于2(大于)
\ 转义字符,是为区分输入重定向,和输出重定向
test 字符串 \< 字符串2 字符串1小于2 (小于)
Var=3 var
test -z $var test -z $var
echo $? echo $?
0 1
3)整数值比较测试 格式 只能整数值比较
格式:
[ 整数1 操作符 整数2 ]
常用的测试操作符 案例
-eq 判断是否相等 (equal)
-ge 判断是否大于等于 (greater than or equal)
-gt 判断是否大于 (greater than)
-le 判断是否小于等于 (less than or equal)
-lt 判断是否小于 (less than)
-ne 判断是否不等于 (not equal)
Var=3
Test $var -eq 1 判断是否相等
或者
[ var -eq 1] 然后echo $? 查看是否为0,0则为真
test 文件1 –ge 整数2 文件1大于等于整数2
test 文件1 –gt 整数2 文件1大于整数2
test 文件1 –le 整数2 文件1小于等于整数2
test 文件1 –lt 整数2 文件1小于整数2
test 文件1 –ne 整数2 文件1不等于整数2
4.)判断表达式
if test (表达式为真)
if test ! 表达式为假 !取反 -a 与 -o 或
test 表达式1 –a 表达式2 两个表达式都为真
test 表达式1 –o 表达式2 两个表达式有一个为真
1.算数表达式的逻辑测试
((算数表达式))
例如:
((2-1)) echo $? 0
((2-2)) echo $? 1
算数表达式的结果不为0,逻辑结果为真,($?=0),
算数表达式的结果为0,逻辑结果为“假”,($?=0),
2.逻辑测试 格式
[ 表达式1 操作符 表达式2 ] ...
常用的测试条件的逻辑操作符 案例
!逻辑非(NOT),它放在任意逻辑表达式之前,使原来的表达式由真变假,或者由假变真。
例如:
[ ! -r $1 ]
另一种写法
!test -r “$1” 这句相当于说$1的内容非可读才是真
-a 逻辑与,“而且”的意思,
前后两个表达式都成立时整个测试结果才为真,否则为假
例如:
[ -f “$myfile” -a -r “$myfile” ] $myfile即是文件又可读才是真,否则为假
-o 逻辑或,“或者”的意思
操作符两边至少一个为真时,结果为真,否则结果为假
例如:
[ “$a” -ge 0 -o “$b” -le 100] 假如$a=5整个结果就是真了。有一个为真就是真
()圆括号,把一个逻辑表达式括起来,使之优先得到运算,缺省下-a 的优先级高于-o,()可以改变这种优先级
-a 逻辑与 而且 ----两个表达式都为真
例如:
[ -f abc.err -a -d my_dir1]
文件 与 目录
或者
test -f abc.err -a -d my_dir1
test 表达式1 –a 表达式2 两个表达式都为真
[ -f abc.err -a -d my_dir1]只能在[] 里面写参数,
! 逻辑非 取反 使原来的表达式由真变假,或者由假变真。
[ -f abcd.err ] echo $? 0
[ ! -f abcd.err ] echo $? 1
-o 逻辑或 两个表达式有一个为真
test 表达式1 –o 表达式2 -----两个表达式有一个为真
[ ! \( -f abc.err -o -d my_dir1 \ ) -a -b /dev/sda]
!取反 反义
第十四天判断语句
If格式
if [ 条件判断 ];
then ---判断条件是否成立,若成立,执行代码,
格式:
[ ]; 前后必须有空格
命令块 --直接写命令,在同一行分号隔开:
fi 结束
(1)格式1判断条件 -gt lt eq ge le ne f d l b快设备 c字符设备 案例
[ $shu -gt 80 ]; -gt 大于 -lt 小于 -eq 等于 -ge 大于等于 -le 小于等于 -ne 不等于
[ $name = "zhang" ];---用 = 做字符的判断 注:=左右无空格表示赋值功能,=左右有空格表示判断功能
[ -f "/mnt/f1 " ]; --- -f判断是否是文件或文件是否存在 -d 判断目录 -l 判断软链接 -b 块设备 -c 字符设备
[ -r "/mnt/f1" ]; --- -r判断是否有读权限 -w 判断写权限 -x 判断执行权限
[ -z $shu ]; --- -z判断变量值是否为空,若为空,则判断结果成立
[ 条件1 -a 条件2 ]; --- -a表示and,即与运算 -o 表示or,即或运算
例:
[ $age -ge 20 -a $age -le 35 ];
[ ! 条件 ]; --- ! 表示取反值
案例:
read -p "Pls input Your choice(number):" var1
if [ "$var1" -gt 4 ]
then
echo "Value is out of range "
fi
(2)格式2: if then 案例
if [ 条件判断 ];
then ---条件满足执行代码1,不满足执行代码2
//代码1
else
//代码2
fi
read -p "Pls input Your choice(number):" var1
if [ "$var1" -gt 4 ];
then
echo "Value is out of range "
else
echo "you input is $var1"
fi
(3)格式3:
if [ 条件1 ];
then ---条件1满足执行代码1,
//代码1
elif [ 条件2 ];
then --- 否则,条件2满足执行代码2
//代码2
elif [ 条件3 ];
then --- 否则,条件3满足执行代码3
//代码3
else
//代码4 ---之前所有条件都不满足
Fi
注:多级判断时,判断条件的先后顺序
#先判断条件1,如果为真则执行条件elif2,3,,如果条件1为假则执行else
案例:
read -p "Pls input Your choice(number):" var1
if [ "$var1" -le 4 ];
then
echo "you input is haha"
elif [ $1 -eq 5 ]
then
echo "your input is 5"
elif [ $1 -eq 6 ]
then
echo "input is 6"
elif [ $1 -eq 7 ]
then
echo "input is 7"
else
echo "you input is out of rang"
fi
注意
[root@centos7 ss]# ./if
Pls input Your choice(number):4
you input is haha
[root@centos7 ss]# ./if 7 ---因为比4大,所以输入5是,会输入这个7
Pls input Your choice(number):5
input is 7
[root@centos7 ss]#
2.)循环语句while格式 案例
功能:重复性执行某个操作
while [ 条件判断 ]
do
命令1
命令2
....(//代码)
命令n
done
执行过程:条件=>代码=>条件=>代码=>...=>直到条件不满足
循环四要素:初值 条件 循环体 变量更新,避免:无循环 死循环
案例
1)计算1-100之间各数之和
sum=0 #----定义变量
shu=1 #----定义变量
while [ $shu -le 100 ]; #----shu小于100
do
let sum=$sum+$shu #----累加
let shu=$shu+1 #---原来值+1,再去循环是否小于100,是就接着循环
done #----表示结束
echo $sum #---输出sum
2)计算任意数的和(从1开始)
sum=0 #----初始值总和为0
shu=1 #----数为1
read -p "Pls input a number:" var #----请输入一个数 var表示任意变量
while [ $shu -le $var ]; #----比较shu是否小于等于var变量
do
let sum=$sum+$shu #sum为sum+shu ,新值
let shu=$shu+1
done
echo $sum
3)计算1-100间3的倍数之和
sum=0
shu=1
while [ $shu -le 100 ];
do
let yu=$shu%3 #--余数=shu%3
if [ $yu -eq 0 ]; then #---余数=0时,然后下一步
let sum=$sum+$shu #--接着相加,不为0时fi结束
fi
let shu=$shu+1
done
echo $sum
:字符串
jiXu="y" #--- 继续=yes
while [ $jiXu = "y" ]; #-- 条件为真
do
echo "上午上课"
echo "下午实验"
echo "晚上自习"
read -p "明天继续吗?y/n:" jiXu
done
3.)循环控制语句break 格式案例
break [n] 停止、跳出循环
continue 停止本次循环,跳入下一次循环
While [条件判断]
do m1
命令块 m2
continue 中断循环,开新的循环
m3 不运行了
done
案例
1)计算1-100之间各数之和,求加到几的时候,和超过1000
shu=1
sum=0
while [ $shu -le 100 ];
do
let sum=$sum+$shu ---循环相加求和
if [ $sum -ge 1000 ]; then
break
fi
let shu=$shu+1
done
echo shu=$shu sum=$sum
2)计算1-100间3的倍数之和
shu=1
sum=0
while [ $shu -le 100 ];
do
let yu=$shu%3
if [ $yu -ne 0 ]; ---查看余数是否不等于0
then
let shu=$shu+1
continue
fi
let sum=$sum+$shu
let shu=$shu+1
done
4.)for循环格式 案例
for 变量 in 值1 值2 值3 ... ---把后面给定的值,依次赋值给变量,带入代码执行
do
//代码
Done
缺点:for不支持做范围的指定
案例
1 )计算1-10之间各数之和
sum=0
for shu in 1 2 3 4 5 6 7 8 9 10
do
let sum=$sum+$shu
done
echo $sum
5.)多分支语句case格式 案例
case $变量 in ---根据变量的值,找到下面对应的值项,运行对应代码
值1) 代码1 ;; --- ;; 表示本项代码的结束
值2) 代码2 ;;
值3) 代码3 ;;
*) 代码4 ;; --- *项,表示给定的值与变量的值都不匹配时,执行*项
esac
案例
case $1 in
*[!0-9]* ) echo "The first is not a number" ---不是0-9,输出3
exit 3
;;
* ) echo "The first is number! value is $1" ---是数字,输出 0
exit 0
;;
esac
[root@centos7 ss]# ./zz
The first is number! value is
[root@centos7 ss]# ./zz aa2
The first is not a number
[root@centos7 ss]# ./zz 123
The first is number! value is 123
[root@centos7 ss]# echo $?
0
[root@centos7 ss]# ./zz aaa
The first is not a number
[root@centos7 ss]# echo $?
3
6.)选择语句select格式 案例
select 变量 in 值1 值2 值3 ... ---把后面给定的值,当做菜单显示,根据人为的选择,把对应的值赋值给变量,带入代码
do
//代码
break --- 跳出本结构,若不写break,则循环选择
done
特殊应用
userName=`awk -F ":" '{print $1}' /etc/passwd` ; echo $userName
注:给变量赋值时,变量值中不支持回行,多行的值,赋给变量,也是一行存储的
7.)read格式
一行内容格式案例
read hang < /mnt/f1 ---读取文档中的第一行文字,赋值给变量
[root@centos7 ss]# vi f1
bcd 1234 adas
dasdas
55566 kkss
sdkja\skd 0099 kkk
~
---------编辑f1 文件
[root@centos7 ss]# echo $f1
bcd 1234 adas ---输出第一行
全部输出 格式案例
while read hang ---逐行读取文档的内容,每次读取一行,赋值给变量,带入代码中
do
echo $hang
done < /mnt/f1
案例
[root@centos7 ss]# while read var ---输出全部
> do
> echo $var ---输出全部
> done <f1
bcd 1234 adas
dasdas
55566 kkss
sdkjaskd 0099 kkk
[root@centos7 ss]# while read var
> do
> echo $var
> echo $var |grep 555
> if [ $? -eq 0 ] ;then
> break ---Break跳出,提取
> fi
> done < f1 ----从f1 里面读取
bcd 1234 adas
dasdas
55566 kkss
55566 kkss
读取字段 格式 案例
while read c1 c2 c3 ---逐行读取文档的内容,每次读取一行,把该行的各列的值,赋值给对应的变量
do c1 c2 c3 为多个变量
echo $c2
done < /mnt/f2
案例
[root@centos7 ss]# vi f1 ---编写vi
bcd 1234 adas
dasdas
55566 kkss
sdkja\skd 0099 kkk
~
[root@centos7 ss]# while read var1 var2 var3 ---var1,var2 读取第几行
> do
> echo $var2 -----输出第二行
> done <f1 ----从f1 里面读取
1234
kkss
0099
8.)函数编写 格式 案例
函数编写---又称方法
功能:在shell脚本中,编写一段独立的代码,完成一个小功能。被正常的代码所调用
目的:被多次执行的相同代码,写到函数中,被多次调用即可,无需把代码写好多遍,简化代码量
定义格式:
当成命令来使用,不用写vi,# 下写就行
function 函数名( ) { --函数名后一定有圆括号,function关键词可省略
//代码 shell ()无东西
}
或
函数名( ){
//代码
}
( )子shell { }当前shell
定义函数后可以当命令来使用
案例
求1-n之间各数之和
function qiuHe(){ -----qiuHe是定义的函数
read -p "请输入要累加到的数字:" n
sum=0
shu=1
while [ $shu -le $n ];
do
let sum=$sum+$shu ---可以echo $sum和$shu 查看
let shu=$shu+1 当前shell可知
done
echo $sum
}
echo then is sum of 1 - n: #
qiuHe ---代码中直接写函数名,即可实现函数调用
9.)参数传递
函数在运行时,需要调用方给其提供素材性数据,以参数传递的形式完成
定义格式:
在函数代码中,以 $n 的格式使用参数,n表示编号,从1开始计数
调用格式:调用方按照函数所需参数的个数,调用时,在函数名后一一列举
案例 求和累加
function qiuHe(){
sum=0
shu=1
while [ $shu -le $1 ];
do
let sum=$sum+$shu
let shu=$shu+1
done
echo $sum
}
echo "请输入要累加到的数字"
read n
echo 1- $n 的累加和是:
qiuHe $n ---调用函数,并传递参数
案例 求减法
function qiuJianFa(){
let cha=$1-$2
echo $cha
}
echo "请输入要第一个数字"
read n1
echo "请输入要第二个数字"
read n2
qiuJianFa $n1 $n2
10.)返回值格式
函数运行完毕,携带结果数据,返回调用方
格式: 函数中,用return指定返回的值,调用方代码中,调用后,用$?的格式去使用返回值,注:返回值只能有一个
1.案例
function qiuJianFa(){
let cha=$1-$2
return $cha
}
echo "请输入要第一个数字"
read n1
echo "请输入要第二个数字"
read n2
qiuJianFa $n1 $n2
echo 两数相减的差为:$?
注意:脚本代码中函数的定义语句必须写在调用语句之前
脚本中可以编写参数调用,人为再运行脚本时,给其传递参数
2.案例.返回值
返回值 return 返回
# function fanhui (){
> if [ $1 -lt 5 ] #---如果输入的$1 小于5
> then
> echo you #---则输出 you
> return 1 #--- echo $? 查看是回复 1
> elif [ $1 -gt 10 ] #--或者 输入的$1 大于10
> then
> echo wo #--输出 wo
> return 2 #-- echo $? 查看是回复 2
> else #--其他情况则输出wbzd
> echo wbzd
> return 0 #--- echo $? 查看是回复 0
> fi # --结束
注意 # type fanhui 可查看内容
# fanhui 加数字可使用 ----定义函数可以当作命令
11.)案例 命令保存到 函数库 格式 vi .bash _profile
想要保存 保存在函数库里,
1.先写一个vi 把函数命令保存在里面: vi fu
2.然后设置权限: chmod a+x fu
3.要使每次开机运行它,
写入 vi .bash _profile
在 export PATH 下加入自己的文件
如:
. /root/fu --- . 表示当前shell /root/fu 为路径
案例
# function fanhui (){
> if [ $1 -lt 5 ] #---如果输入的$1 小于5
> then
> echo you #---则输出 you
> return 1 #--- echo $? 查看是回复 1
> elif [ $1 -gt 10 ] #--或者 输入的$1 大于10
> then
> echo wo #--输出 wo
> return 2 #-- echo $? 查看是回复 2
> else #--其他情况则输出wbzd
> echo wbzd
> return 0 #--- echo $? 查看是回复 0
> fi # --结束
vi fu
将内容写进去
然后
chmod a+x fu
vi . bash _profile在export PATH 下写入
. /root/fu
exit ---退出
然后
fanhui 5 ---$1 变量 为5
linux条件测试操作(test)和if判断语句,while循环语句,break控制语句和for循环和case多分枝语句和select语句的更多相关文章
- Shell基础(二):Shell中的数值运算、条件测试操作、使用if选择结构
一.Shell中的数值运算 目标: 本案例要求熟悉Linux Shell环境的特点,主要练习以下操作: 1> 使用expr.$[ ].let等整数运算工具:定义变量X=1234,然后计算X与78 ...
- 第二十篇 Linux条件测试语句相关知识点介绍
条件测试语句的格式如下: [ 条件表达式 ] # 条件表达式两侧各有一个空格 按测试对象不同,条件测试语句共分为4中类型: 文件测试语句 逻辑测试语句 整数值比较语句 字符串比较语句 ...
- linux文件测试操作
1.文件测试操作 返回 true 如果... -e 文件存在 -a 文件存在 这个选项的效果与-e 相同.但是它已经被弃用了,并且不鼓励使用 -f file 是一个 regular 文件(不是目录或者 ...
- linux 条件测试 ******
文件状态测试 -b filename 当filename 存在并且是块文件时返回真(返回0) -c filename 当filename 存在并且是字符文件时返回真 -d pathname 当path ...
- 学习笔记:CentOS7学习之二十一: 条件测试语句和if流程控制语句的使用
目录 学习笔记:CentOS7学习之二十一: 条件测试语句和if流程控制语句的使用 21.1 read命令键盘读取变量的值 21.1.1 read常用见用法及参数 21.2 流程控制语句if 21.2 ...
- 四 Shell条件测试
条件测试操作 在bash的各种流程控制结构中通常要进行各种测试,然后根据测试结果执行不同的操作,有时也会通过与if等条件语句相结合,让我们可以方便的完成判断. 语法格式 test 选项 文件名或目录名 ...
- shell条件测试和流程控制
一.条件测试操作 1.test 用途:测试特定的表达式是否成立,当条件成立时,命令执行后的返回值为0,否则为其他数值 格式:test 表达式 2.常见的测试类型 ①测试文件状态 格式:[ 操作符 文件 ...
- 关于shell脚本——条件测试、if语句、case语句
目录 一.条件测试 1.1.表达说明 1.2.test命令 文件测试 1.3.整数值比较 1.4.字符串比较 1.5.逻辑测试 二.if语句 2.1.单分支结构 2.2.双分支结构 2.3.多分支结构 ...
- Linux:Day6(上) egrep、条件测试
egrep及扩展的正则表达式: egrep = grep -E 扩展正则表达式的元字符: 或者:a | b 练习: 1.显示当前系统root.centos或user1用户的默认shell和UID: 2 ...
随机推荐
- 区间dp(能量项链)
[题目大意] 在Mars星球上,每个Mars人都随身佩带着一串能量项链.在项链上有N颗能量珠.能量珠是一颗有头标记与尾标记的珠子,这些标记对应着某个正整数.并且,对于相邻的两颗珠子,前一颗珠子的尾标记 ...
- 洛谷 P1433 吃奶酪 状压DP
题目描述 分析 比较简单的状压DP 我们设\(f[i][j]\)为当前的状态为\(i\)且当前所在的位置为\(j\)时走过的最小距离 因为老鼠的坐标为\((0,0)\),所以我们要预处理出\(f[1& ...
- Tallest Cow,题解
题目链接 题意: 问满足一系列形如ab可以相互看到的约束的所有奶牛的最大身高(最高的编号和高度已给出) 分析: 首先,这个可以互相看到指的是中间的人比两头的都矮,一条斜线看到的不行,那么其实我们就可以 ...
- Git上传本地项目到远程仓库
一.在gitee或其他仓库上创建工程,名称需要和本地工程名称一致. 二.找到本地项目工程,进入工程目录,如下图,然后依次执行下列命令: 1.git init //初始化本地仓库 2. git add ...
- Windows Socket编程精华《TCP通信服务器》
1.网络中进程之间如何通信? 首要解决的问题是如何唯一标识一个进程,否则通信无从谈起!在本地可以通过进程PID来唯一标识一个进程,但是在网络中这是行不通的.其实TCP/IP协议族已经帮我们解决了这个问 ...
- java8的parallelStream提升数倍查询效率
业务场景 在很多项目中,都有类似数据汇总的业务场景,查询今日注册会员数,在线会员数,订单总金额,支出总金额等...这些业务通常都不是存在同一张表中,我们需要依次查询出来然后封装成所需要的对象返回给前端 ...
- java 基础(四)搭建vim作为java开发环境
分享在Ubuntu 14.04在Vim上配置Java开发环境的过程步骤,希望对大家有所帮助. A 首先下载javacomplete.zip 到Linux公社资源站下载: --------------- ...
- 机器学习实战基础(十三):sklearn中的数据预处理和特征工程(六)特征选择 feature_selection 简介
当数据预处理完成后,我们就要开始进行特征工程了. 在做特征选择之前,有三件非常重要的事:跟数据提供者开会!跟数据提供者开会!跟数据提供者开会!一定要抓住给你提供数据的人,尤其是理解业务和数据含义的人, ...
- ffmpeg源码编译环境搭建
ffmpeg是视频开发最常用到的开源软件,FFmpeg功能强大,用途广泛,提供几乎所有你能够想到的与视频开发相关的操作,许多商业软件都以ffmpeg为基础进行开发定制. FFmpeg: FFmpeg ...
- 在ShareX里添加流浪图床
这里以咱流浪图床为例哈:-D 上传目标类型:图像.文件 请求方法:POST 请求URL:https://p.sda1.dev/api/v1/upload_external_noform URL参数:名 ...