条件测试
格式1:test 条件表达式 格式2:[ 条件表达式 ] #注意空格
测试文件
测试文件
#[ 操作符 文件或目录 ] ,注意中括号两边必须有空格
-d:测试是否为目录,是则为真(Directory)
-e:测试目录或文件是否存在,存在则为真(Exist)
-f:测试是否为文件,是则为真(file)
-r:测试当前用户是否有权限读取,是则为真(read)
-w:测试当前用户是否有权限写入,是这为真(write)
-x:测试当前用户是否可执行该文件,可执行则为真(Excute)
-L:测试是否为符号链接文件,是则为真(Link)
-nt:file1 -nt file2 如果 file1 比 file2 新(修改时间),则为真
-ot:file1 -ot file2 如果 file1 比 file2 旧(修改时间),则为真
字符串比较
字符串比较
#[ 字符串1 = 字符串2 ] [ 字符串1 != 字符串2 ] [ -z 字符串 ]
=:字符串内容相同则为真,就是说包含的文本一摸一样。
!=:字符串内容不同,则为真(!号表示相反的意思)
-z:字符串内容为空(长度为零)则为真
-n:字符串内容非空(长度非零)则为真
<:string1 < string2 如果string1在本地的字典序列中排在string2之前,则为真
>:string2 如果string1在本地的字典序列中排在string2之后,则为真
#注意:
1、字符串的 “等于” 比较,为了与POSIX一致,在[]中使用=,(尽管==也可以可以用的)
2、注意在=前后各有一个空格,如果没有空格就是赋值的关系,不是比较的关系。
3、字符串的> <比较运算符,一般放在[[ ]]之中,而不是test ("[]")
4、字符串的> <比较的结果,与本地的locale有关,是按照其字典序列进行比较的
整数值比较
整数值比较
#[ 整数1 操作符 整数2 ]
-eq:等于(equal)
-ne:不等于(not equal)
-gt:大于(Greater than)
-lt:小于(lesser than)
-le:小于等于(lesser or equal)
-ge:大于等于(Greater or equal)
逻辑测试
逻辑测试
[ 表达式1 ] 操作符 [ 表达式2 ] ...
-a 或 && :逻辑与,“而且”的意思,前后两个表达式都成立时整个测试结果才为真,否则为假
-o 或 || : 逻辑或,“或者”的意思,操作符两边至少一个为真时,结果为真,否为为假
! :逻辑否,当制定条件不成立时,返回结果为真
if判断
下面三个个格式都可以
if condition1 #该条件表达式成立
then
command1 #则执行此处代码
elif condition2 #该条件表达式成立
then
command2 #则执行此处代码
else #上面表达式都没命中则
commandN #执行此处代码
fi
case 判断(支持正则)
case 值 in
模式1) #是否成立此处条件,成立则执行该条件下面的代码(支持正则)
command1
command2
...
commandN
;;
模式2) #是否成立此处条件,成立则执行该条件下面的代码
command1
command2
...
commandN
;;
*) #若上面条件都不成立,则执行此处代码
;;
esac
for 循环
for var in item1 item2 ... itemN #var会依次提取后面的值(默认为空格,如果内容包含空格加引号)
do
command1
command2
...
commandN
done
---------------------------------------------------------------------------------------------
#目录循环
#!/bin/bash
for file in /var/log/*
do
echo $(basename $file) in "/var/log"
done
#位置参数循环
#!/bin/bash
for seat in "$@"
do
echo "$seat"
done
#使用seq产生循环
#!/bin/bash
for j in $(seq 1 5)
do
echo $j
done
while循环
while condition #条件成立,则循环,如果为true,则是死循环
do
command
done
-------------------------------------------------------------
#!/bin/bash
#批量添加20个系统账户用户名依次为user1~10
i=1
while [ $i -le 10 ]
do
useradd user$1
echo "123456" | passwd --stdin user$i &> /dev/null
i=`expr $i + 1`
done
until 循环(与while相反)
until condition #条件表达式不成立则循环
do
command
done
shift迁移 #用于位置变量迁移,$1~$9依次向左传递
依次相加
#!/bin/bash
res=0
while [ $# -gt 0 ]
do
res=`expr $res + $1`
shift
done
echo "the sum is:$res"
------------------------------
#这个应该好看懂点
#!/bin/bash
for ((i=1;i<=${#};i=i))
do
echo "剩余位置数量 $# 内容:$*"
shift
done
shift.sh结果如下
continue #跳回当前循环
continue语句 #在for、while、until
等循环语句中,用于跳过循环体内余下的语句,重新判断条件以便执行下一次循环。
while 条件 ←-←-←-←-←--
↑
do |
↑ #它会直接跳回当前循环,重新判断条件语句
command... |
↑
continue →-→-→-→-→-→
command...
done
command...
command...
break #跳出当前循环
break语句 #在for、while、until
等循环语句中,用于跳出当前所在的循环体,执行循环体之后的语句。
while 条件测试
do
command
break →-→-→-→-→-→---
|
command ↓
| #break直接跳出当前循环,往下执行
done ↓
|
command ←-←-←-←-←-←
command
#下面可以试试他们的区别
#可以试试continue和break的效果
#!/bin/bash
for((i=1;i<10;i++))
do
for((j=1;j<=$i;j++))
do
echo -n " $i*$j=$((i*j)) "
#echo -n " continue "
#continue
#echo -n " break "
#break
done
#echo -n"continue"
#continue
#echo -n "break"
#break
echo
done
这三个赋值看起来都比较像”将换行符赋值给IFS“,但实际上只有最后一种写法才是我想要的结果。
IFS=‘\n’ //将字符n作为IFS的换行符。
IFS=$"\n" //这里\n确实通过$转化为了换行符,但仅当被解释时(或被执行时)才被转化为换行符。
IFS=$'\n' //这才是真正的换行符。