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    命令因受到信号而死亡

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 158,736评论 4 362
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,167评论 1 291
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 108,442评论 0 243
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 43,902评论 0 204
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,302评论 3 287
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,573评论 1 216
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,847评论 2 312
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,562评论 0 197
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,260评论 1 241
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,531评论 2 245
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,021评论 1 258
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,367评论 2 253
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,016评论 3 235
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,068评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,827评论 0 194
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,610评论 2 274
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,514评论 2 269

推荐阅读更多精彩内容

  • 个人学习批处理的初衷来源于实际工作;在某个迭代版本有个BS(安卓手游模拟器)大需求,从而在测试过程中就重复涉及到...
    Luckykailiu阅读 4,527评论 0 11
  • linux资料总章2.1 1.0写的不好抱歉 但是2.0已经改了很多 但是错误还是无法避免 以后资料会慢慢更新 大...
    数据革命阅读 12,016评论 2 34
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,201评论 0 17
  • 六月十八日父亲节,远在天堂的爸爸你还好吧,一天又一天过去了,你已经离开我们十几年了,可是以前的一幕一幕还经常在眼前闪过
    溪玉阅读 158评论 2 1
  • 错过了就是错过了,无论友情还是爱情
    毛炸炸hh阅读 144评论 1 1