bash学习笔记2 使用结构化命令

本文详细介绍了Bash脚本中的条件结构,包括if-then-else,嵌套if,以及test命令的使用。讲解了数值比较、字符串比较和文件比较,并提到了复合查询及双圆括号和双方括号的高级特性。同时,文章还强调了在字符串和文件比较中避免逻辑错误的注意事项。
摘要由CSDN通过智能技术生成

1 if 结构

 1.1  if then

bash 中会运行if后面的命令,如果该命令的退出码为0(运行成功),then后面的语句才会继续进行

if 后面要加个空格

例子:

testuser=spider
if grep $testuser /etc/passwd
then
    echo -n "the bash file for user $testuser is " 
    ls -a /home/$testuser/.b*
fi
 #如果then放在if这行 则需要在if后面加分号
if grep $testuser /etc/passwd; then
    echo -n "the bash file for user $testuser is " 
    ls -a /home/$testuser/.b*
fi
	


1.2   if then else  若if后面的命令没有运行成功,运行else后面的语句

1.3  嵌套if  

else if 的简写是 elif 

if xx ; then

xxx

elif xxx ;then

xxx

else 

xxx

fi


2 test命令

test有两种写法

if test condition;then

xxx

fi


if [ condition ] ;then

xxx

fi

 注意方括号内侧要留个空格

if test 1 -eq 2;then
    echo "1==2"
else
    echo "1!=2"
fi

if [ 1 -eq 2 ];then
    echo "1==2"
else
    echo "1!=2"
fi

2.1 数值比较


var=5
if [ $var -eq 5 ];then
    echo "$var equals 5"
else
    echo "$var not equals 5"
fi

var=5
if [ $var -eq "5" ];then
    echo "$var equals 5"
else
    echo "$var not equals 5"
fi 

结果是一样的 都是equals

这说明test将字符串转化为整数了.遇到无法转化的,如"5i"等,就会报错


还有一点要注意,test只支持整数比较,小数会报错.


2.2  字符串比较


注意大于小于要写转义,不然会被认为是重定向符号


var1="test"
var2="Test"
if [ $var1 \< $var2 ];then
    echo "$var1 is small"
else
    echo "$var2 is small"
fi

这里输出Test is small.

这需要注意: test中的大写字母比小写字母小

sort命令相反.


判断字符串的长度

var=""
if [ -n "$var" ];then
    echo "$var is not empty"
else
    echo "$var is empty"
fi


var1="123"
if [ -n "$var1" ];then
    echo "$var1 is not empty"
else
    echo "$var1 is empty"
fi

关于字符串双引号:

赋值时有双引号,取值时没有双引号

比如 
var="test"

echo $var 

结果是test


 在进行字符串比较时,如果字符串为空,而取值时又没加双引号,会有意想不到的结果:

如 

var=""

if [ -n $var ] 会变成 if [ -n ] 而非 if [ -n "" ] ,失去了本意

所以在可能为空的地方 需要给变量加上双引号



2.3 文件比较


在对文件或者目录进行操作前,检查下非常有用.



 3 复合查询

if [ condition1 ] && [ condition2 ] ; 

if [ condition 1 ] || [ conditon2 ]


4 高级特性

4.1 双圆括号  ((  ))


圆括号提供了一些列的数学运算

大小于符号不再需要转义


4.2 [[ ]] 双方括号

提供了匹配功能



引用别人的文章:

   bash  [[  ]] 双方括号

基本要素:

Ø  [[ ]] 两个符号左右都要有空格分隔

Ø  内部操作符与操作变量之间要有空格:如  [[  “a” =  “b”  ]]

Ø  字符串比较中,可以直接使用 > < 无需转义

Ø  [[ ]] 中字符串或者${}变量尽量如未使用"" 双引号扩住的话,会进行模式和元字符匹配

[root@localhostkuohao]# [[ "ab"=a* ]] && echo "ok"

  ok

Ø  [[] ] 内部可以使用 &&  || 进行逻辑运算

Ø  [[ ]] 是bash  keyword:[[ is a shell keyword

[[ ]] 其他用法都和[ ] 一样

二者共同特性:

Ø  && ||-a –o 处理

[  exp1  -a exp2  ] = [[  exp1 && exp2 ]] = [  exp1  ]&& [  exp2  ] = [[ exp1  ]] && [[  exp2 ]]

[  exp1  -o exp2  ] = [[  exp1 || exp2 ]] = [  exp1  ]|| [  exp2  ] = [[ exp1  ]] || [[  exp2 ]]

[root@localhost ~]# if [[ "a" == "a" && 2 -gt1 ]] ;then echo "ok" ;fi

ok

[root@localhost ~]# if [[ "a" == "a" ]] && [[2 -gt 1 ]] ;then echo "ok" ;fi

ok

[root@localhost ~]# if [[ "a" == "a" ]] || [[ 2 -gt 1]] ;then echo "ok" ;fi

ok

[root@localhost ~]# if [[ "a" == "a" ]] || [[ 2 -gt10 ]] ;then echo "ok" ;fi

ok

[root@localhost ~]# if [[ "a" == "a"  || 2 -gt 10 ]] ;then echo "ok" ;fi

ok

Ø  [[ ]]  [ ] 都可以和 ! 配合使用

优先级 !  >  && > || 

逻辑运算符  < 关系运算符

逻辑运算符   !  &&  || -a  -o

关系运算符   <  >  \> \<  ==  = !=  – eq –ne  -gt -ge  –lt  -le

 

-----------------------------------------------------------------------------

n  [[  ]] [ ] 具备的优势

-----------------------------------------------------------------------------

 

    ①[[是 bash 程序语言的关键字。并不是一个命令,[[ ]] 结构比[ ]结构更加通用。在[[和]]之间所有的字符都不会发生文件名扩展或者单词分割,但是会发生参数扩展和命令替换。

   

    ②支持字符串的模式匹配,使用=~操作符时甚至支持shell的正则表达式。字符串比较时可以把右边的作为一个模式,而不仅仅是一个字符串,比如[[ hello == hell? ]],结果为真。[[ ]] 中匹配字符串或通配符,不需要引号。

   

    ③使用[[ ... ]]条件判断结构,而不是[... ],能够防止脚本中的许多逻辑错误。比如,&&、||、<和> 操作符能够正常存在于[[ ]]条件判断结构中,但是如果出现在[ ]结构中的话,会报错。

   

    ④bash把双中括号中的表达式看作一个单独的元素,并返回一个退出状态码。

       

使用[[ ... ]]条件判断结构, 而不是[ ... ], 能够防止脚本中的许多逻辑错误. 比如,&&, ||, <, 和> 操作符能够正常存在于[[]]条件判断结构中, 但是如果出现在[ ]结构中的话, 会报错。

 


Case语句


USER="rich"
case $USER in 
rich | baba )
    echo "welcome"
    ;;
test)
echo "test account"
;;
*)
echo "not welcome"
esac

  

括号中可以使用正则表达式

竖线表示或

每个条件结束时写 ;;

esac结束




  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值