Shell 语句语法详解

Shell 语句语法详解

shell里的if语句

if 语句通过关系运算符判断表达式的真假来决定执行哪个分支。Shell 有三种 if ... else 语句:

if ... fi 语句;

if ... else ... fi 语句;

if ... elif ... else ... fi 语句。

三种语句格式分别如下所示:

#####################################

if [ ! -e "test.sh" ]

then

    echo "the file is not exit"

    #do something

fi

#####################################

if [ ! -e "test.sh" ]

then

    echo "the file is not exit"

    #do something

else

    echo "the  file is exit"

    #do something

fi

#####################################

if [ -e "test1.sh" ]

then

    echo "the test1 file is exit"

    #do something

elif [ -e "test2.sh" ]

then

    echo "the test2 file is exit"

    #do something

else

    echo "the test1 and test2 file are not exit"

    #do something

fi

#####################################


if语句使用方法

if语句后的条件需要用方括号括起来,并且方括号里的操作和左右方括号之间需要用括号括起来,例如:

if [ -e "/home/test.sh" ]

该语句为判断home路径下是否存在tesh.sh的文件,如果存在则返回true,不存在返回false,同理如果判断文件不存在则可以用如下指令:

if [ ! -e "/home/test.sh " ]

此时如果文件不存在则返回true,存在返回false。

整数比较

-eq 等于,如:if [ "$a" -eq "$b" ]

-ne 不等于,如:if [ "$a" -ne "$b" ]

-gt 大于,如:if [ "$a" -gt "$b" ]

-ge 大于等于,如:if [ "$a" -ge "$b" ]

-lt 小于,如:if [ "$a" -lt "$b" ]

-le 小于等于,如:if [ "$a" -le "$b" ]

大于(需要双括号),如:(("$a" > "$b"))

>= 大于等于(需要双括号),如:(("$a" >= "$b"))

小数据比较可使用AWK

字符串比较

= 等于,如:if [ "$a" = "$b" ]

== 等于,如:if [ "$a" == "$b" ],与=等价

注意:==的功能在[[]]和[]中的行为是不同的,如下:

1 [[ $a == z* ]] # 如果$a以"z"开头(模式匹配)那么将为true

2 [[ $a == "z*" ]] # 如果$a等于z*(字符匹配),那么结果为true

3 [ $a == z* ] # File globbing 和word splitting将会发生

4 [ "$a" == "z*" ] # 如果$a等于z*(字符匹配),那么结果为true

一点解释,关于File globbing是一种关于文件的速记法,比如"*.c"就是,再如~也是.

但是file globbing并不是严格的正则表达式,虽然绝大多数情况下结构比较像.

!= 不等于,如:if [ "$a" != "$b" ]

这个操作符将在[[]]结构中使用模式匹配.

大于,在ASCII字母顺序下.如:

if [[ "$a" > "$b" ]]

if [ "$a" \> "$b" ]

注意:在[]结构中">"需要被转义.

-z 字符串为"null".就是长度为0.

-n 字符串不为"null"

文件操作

[ -a 文件 ] 如果文件存在为真。

[ -b 文件 ] 如果 文件 存在 而且 是一个 块-特殊 文件为真。

[ -c 文件 ] 为真 如果 文件 存在 而且 是一个 字-特殊 文件。

[ -d 文件 ] 为真 如果 文件 存在 而且 是一个 目录。

[ -e 文件 ] 为真 如果 文件 存在。

[ -f 文件 ] 为真 如果 文件 存在 而且 是一个 普通 文件。

[ -g 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SGID 位。

[ -h 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。

[ -k 文件 ] 为真 如果 文件 存在 而且 他的粘住位已经设置。

[ -p 文件 ] 为真 如果 文件 存在 而且 是一个 已经命名的管道 (F 如果O)。

[ -r 文件 ] 为真 如果 文件 存在 而且 是可读的。

[ -s 文件 ] 为真 如果 文件 存在 而且 比零字节大。

[ -t FD ] 为真 如果 文件 文件描述符已经打开 而且 指向一个终端。

[ -u 文件 ] 为真 如果 文件 存在 而且 已经设置了他的 SUID (set user ID)位。

[ -w 文件 ] 为真 如果 文件 为真 如果 文件 存在 而且 是可写的。

[ -x 文件 ] 为真 如果 文件 存在 而且 是可执行的。

[ -O 文件 ] 为真 如果 文件 存在 而且 属于有效用户ID。

[ -G 文件 ] 为真 如果 文件 存在 而且 属于有效组ID。

[ -L 文件 ] 为真 如果 文件 存在 而且 是一个 符号连接。

[ -N 文件 ] 为真 如果 文件 存在 而且 has been mod 如果ied since it was last read。

[ -S 文件 ] 为真 如果 文件 存在 而且 是一个 socket。

[ 文件1 -nt 文件2 ] 为真 如果 文件1 has been changed more recently than 文件2

[ 文件1 -ot 文件2 ] 为真 如果 文件1 比 文件2 旧, 或者 文件2 存在而且 文件1 不存在。

[ 文件1 -ef 文件2 ] 为真 如果 文件1 而且 文件2 refer to the same device 而且 inode

与或非操作

[ 表达式1 -a 表达式2 ] 如果表达式1 而且表达式2 同时为真则为真 。

[ 表达式1 -o 表达式2 ] 如果表达式1 或者表达式2 其中之一为真则为真。

或者是:

if [[( 表达式1 ) &&( 表达式2 ) || ( 表达式3 )]]

比如:

if [[( "$dev_type_config" != "ZC" ) &&( "$dev_type_config" != "ZED" ) && ( "$dev_type_config" != "ZR" )]]


shell for语句

# !/bin/bash

for ((i=0; i<5; i++))

#for var in {0..5}

#for var in {0..100..2}

do

if ((i==1))

then

continue

fi

echo "the value is $i"

done

do和done之间的命令称为循环体,执行次数和list列表中常数或字符串的个数相同。for循环,首先将in后list列表的第一个常数或字符串赋值给循环变量,然后执行循环体,以此执行list,最后执行done命令后的命令序列。

•Sheel支持列表for循环使用略写的计数方式,1~5的范围用{1..5}表示(大括号不能去掉,否则会当作一个字符串处理)。

Sheel中还支持按规定的步数进行跳跃的方式实现列表for循环,例如for var in {0..100..2}为以2作为步进长度。


shell while语句

while 循环称为前测试循环语句,重复次数是利用一个条件来控制是否继续重复执行这个语句。为了避免死循环,必须保证循环体中包含循环出口条件即表达式存在退出状态为非0的情况。

#!/bin/bash

echo "Please input the num "

read num

echo "num is $num"

factorial=1

while [ "$num" -gt 0 ]

do

let "factorial= factorial*num"

let "num--"

done

echo "The factorial is $factorial"

shell until语句

until命令和while命令类似,while能实现的脚本until同样也可以实现,但区别是until循环的退出状态是不为0,退出状态是为0(与while刚好相反),即whie循环在条件为真时继续执行循环而until则在条件为假时执行循环。

#!/bin/bash

i=1

until [[ "$i" -gt 9 ]]    #大于9

do

let "square=i*i"

echo "$i * $i = $square"

let "i++"

done

shell case语句

注意下面的case * 并不是所有,而是输入值不在case中,相当于default. 在循环中可以使用continue/break等关键字,非常类似c和java等其他语言的循环。

#!/bin/bash

case $1 in

"install" )

echo "operation type is install" ;;

"uninstall" )

echo "operation type is uninstall" ;;

* )

echo "operation type is not support" ;;

esac

特殊变量和值

$#    表示变量的个数,常用于循环

$@    当前命令行所有参数。置于双引号中,表示个别参数

$*    当前命令行所有参数。置于双引号中,表示将命令行所有参数当初一个单独参数

$-(连字号)    在引用数给予Shell的选项

$?    表示上一个命令退出的状态

$$    表示当前进程编号

$0    表示当前程序名称

$!    表示最近一个后台命令的进程编号

$HOME    表示当前用户根目录

$IFS    表示内部的字段分隔符

$LANG    当前locale默认名称

$PATH    环境变量

$PPID    父进程编号

$PWD    当前工作目录

下列特殊值可以帮助排查问题

0    成功退出

>0    退出失败

1-125    命令退出失败,失败返回的相关值由程序定义(譬如,程序内退出只执行 exit 2,则返回为2)

126    命令找到了,但无法执行

127    命令找不到

>128    命令因受到信号而死亡


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值