关于文件属性的判断式
例子:
[ -e "/etc/hosts" ] || (echo '/etc/hosts 文件不存在'; exit1)
if [ "$?" -eq 1 ];then
exit
fi
echo '/etc/hosts文件存在'
~
解释:使用-e判断、etc/hosts这个文件是否存在如果不存在,则()开启一个子shell,现实文件不存在,然后传回状态值1
如果离去状态为1就结束这个脚本
例子:
if [ "$LOGNAME" != "root" ] ;then
echo "god need root"
exit 1
fi
echo 'is root now do what you do'
等式的条件判断
例子:
declare -i t
t=$1
if [ $t -qe 100 ] ; then
echo 100 is right
else
echo is not 100,is $t
fi
bash 选项条件判断式
set -o
if [ -o history ] ;then
echo "history is on now"
else
echo "history is off now"
fi
case 条件判断
当条件测试的情况多了起来,ifelif 的语法就会变得很长,不已撰写,也很难维护,case可以补其不足
case语法结构
case 待测项 in
样式串行1 ] 命令区域1;;
样式串行2 ] 命令区域2;;
样式串行3 ] 命令区域3;;
..............
*) 命令区域;;
esac
解释:
如果待测项,和某一个样式串行对比符合的话,case会选择性执行该样式后面的命令区域
命令区域可以使单一质量或多行指令,但最后一个指令要以;;结束
样式串行可以用字符串和通配符组成,名人会区分大小写,
如果样式串行中有好几个字符串要对比,要使用| 可开,|的意思是有"或"的意思
样式串行可以写成 ‘(样式串行)’或省略左边的括号,写成‘样式串行)’
样式*),通常放在case最后一个区域,用来扑捉不符合置顶要是的其他所有情况
最后esac结束case语法
例如:
read yname
case $yname in #case语法行,待测变量为$yname
zhoutao | yuffie | test) #第一组样式串行,有3个项目组成,彼此用| 隔开
echo 'well...'
echo 'long time no see'
echo 'how are you doing'
;; #上面3行,如果符合第一组样式中的其中一个,就执行上面指令,最后用;;结束
(mary | may) ,另外一种写法
echo 'nice to meet you';;
c*)
echo 'long time no see';;#凡是c开头的都执行本区域的命令
*)
echo 'Hi';;3如果输入的$yname不在以上样式中,就执行本区域命令
esac
高级样式
bash的样式可以有以下组件组成,称为样式串行
字符串 如zhoutao
通配符 如*表示任意长度的字符串,c*表示以c开头的字符串 ????表示4个字符串
字符合集 如[a-b]test表示atest,btest
项目分隔符
|
另外bash的选项extglog打开的话,那么bash还支持几种高级的样式对比
?(样式串行),如果符合0个或者一个括号里的样式串行就算对比符合
* (样式串行),如果符合0个以上括号里的样式串行,就算对比符合
@ (样式串行),如果符合括号里的样式长的其中一个,就算对比符合
! (样式串行),只要不是出现在括号里的样式长,就算对比符合
例子:
shopt -s extglob
read yname
case $yname in
j@(ac|xy|pq)k|john|joe|zhoutao) echo 'long time no see';; ##
*)echo 'hi';;
esac
for循环
for循环的运作方式,是将串行的元素一一取出,依序放入指定的变量中,然后重复执行含括的命令区域 (在do和done之间),知道所有元素取完
for的语法结构
for 变量 in 串行 ##将串行中的字段迭代放入变量中
do
命令区域 ##2-3行,重复执行do done之间的命令区域。知道串行没一个字段均处理过为止
done
另外for循环中 in 串行,这一段可以沈略不屑,此时bash会由命令行读取各个参数,轮循带入变量中,
比如
for i in $@
do
命令区域
done
另外for循环经常用在分割字符串行,取出字段元素值
经典例子:取出CSV文件各行的字段,CSV文件时一种用逗号分隔数据字段的春文本文件,适合担任数据库之间汇入,当初数据的中介
declare -i i=0
for line in $(cat file.svs)
do
i=i+1
echo -n "第$i行的字段有:"
save_ifs=$IFS
IFS=','
for f in $line
do
echo -n $f ' '
done
IFS=$save_ifs
echo
done
~ for还有一种用法,和传统程序语言中的for很像,如c语言
语法:
for ((初始条件;终止条件;异动项))
do
命令区域
done
在for循环中,一开始设定初始条件,接着判断终止条件是否成立,如果尚未达成终止条件,就执行do done ,接着执行改动项之后重复上述终止条件的判断,如果终止条件成立,就结束for循环,如果不然就继续执行
例子:
declare -i i sum ##声明变量i和sum是整数
for (( i=1;i<=10;i=i+1)) ##在for循环中i初始值为1,。如果i小于或者等于10就执行命令区域,接着i的值递增1 ,直到i超过10,循环才停止
do
let sum+=i ##sum每次增加i的值,循环结束等于1+2+...+10的综合
done
echo $sum
for的无穷循环
for ((;1;))
do
echo '无敌'
done
while循环
while语法:
while 条件测试
do
命令区域
done
解释:首先进行条件测试,如果传回值为0,(条件测试为真)则进入循环,执行命令区域,否则不进入循环,结束while命令
执行命令区域,这些命令中,应该要有改变条件测试的命令,这样才有机会再有限步骤后结束执行while 循环(除非想要执行无穷循环)
例子:
declare -i i=1
declare -i sum=0 #声明i和sum为整数型
while ((i<=10)) #条件测试,只要i的值小于或等于10就执行循环
do
let sum+=i ###sum+=1和sum=sum+i是一样的,sum累加上i
let ++i ###i的值递增1.慈航是改变条件测试的命令,一旦i大于10,可终止循环
done ###遇到done 回到 while行执行条件测试
echo $sum
显示sum值为55
使用while 循环,读取文件内容
while循环,经典的用法是搭配转向输入,读取文件的内容
例子:
while read line ##使用read由标准输入读取数据,放入变量line中,如果独到数据为空就进入循环
do
echo $line 把改行数据显示出来
done < file.svs #将file.svs的内容转向输入,交给read读取
例子2:
IFS=':'
while read f1 f2 f3 f4 f5 f6 f7
do
echo "账号:$f1,loginshell是:$7"
done < "/etc/group"
while的无穷循环
while ((1))
do
echo '不死'
done
或者
while :
do
echo '不死'
done
util 循环
while循环的条件是测试真值,until循环则是测试假值
语法:
until 条件测试
do
命令区域
done
解释:如果条件测试为假,传回值不为0,就进入循环
例子:
declare -i i=1
declare -i sum=0
until ((i>10))
do
let sum+=1
let++i
done
echo $sum
until无穷循环
until ((0))
do
echo '春哥附体'
done
或
until false
do
echo '曾哥春哥联谊'
done
select 命令
select命令可以建立简易的列表,其语法结构和for 一样
语法:
select 选项变量 in 串行
do
命令区域
done
例子:
ps3='please select: '
select f in *
do
echo "你键入的编号是$REPLY,选择的文件时:$f"
break ##break命令当执行到这里的时候,立即结束select列表
done
break和continue
对于for while until select 而言,如果想要提早结束循环,可在循环中使用break命令,执行break时,会跳出一层的循环,如果想要跳出多层循环,可在break命令之后加上层数n(n一定要大于等于1)
例子:
for ((i=1;i<=10;i++))
do
if [ $i -eq 10 ] ;then
break
fi
echo $i
done
一次跳出2层循环
例子:
for ((i=1;i<=10;i++))
do
for ((j=1;j<=10;j++))
do
r=$((i+j))
if [ $r -eq 100 ] ;then
break 2
fi
echo $r
done
done
continue命令
continue 一样可以用在for while until select 中和break不同的是,continue会跳过本次循环,重新有下一个循环开始执行
转载于:https://blog.51cto.com/fghjk/782916