关于文件属性的判断式

例子:

[ -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会跳过本次循环,重新有下一个循环开始执行