shell脚本学习(三)

目录:

  • printf 命令
  • if...else语句
  • case ... esac 语句
  • for循环
  • while循环
  • until 循环
  • continue、break

1、printf 命令

printf 命令用于格式化输出, 是echo命令的增强版。它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同,移植性要比 echo 好。
如同 echo 命令,printf 命令也可以输出简单的字符串:

printf "Hello, world\n"

printf 不像 echo 那样会自动换行,必须显式添加换行符(\n)
printf命令的语法:printf format-string [arguments...]format-string为格式控制字符串,arguments `为参数列表。

printf 命令不用加括号
format-string 可以没有引号,但最好加上,单引号双引号均可。
参数多于格式控制符(%)时,format-string 可以重用,可以将所有参数都转换。
arguments 使用空格分隔,不用逗号。

示例:

#双引号
printf "%d -- %s\n" 11 "哈哈"
#单引号和双引号效果一样
printf '%d -- %s\n' 11 "哈哈"
#也可以不写引号
printf %s "哈哈"
# 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
printf "%s\n" abc def
printf "%s and %d \n"
# 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
printf "'%s , %d\n'" Hello Shell

输出:

11 -- 哈哈
11 -- 哈哈
哈哈abc
def
 and 0 
./test.sh: line 11: printf: Shell: invalid number
'Hello , 0

注意,根据POSIX标准,浮点格式%e、%E、%f、%g与%G是“不需要被支持”。这是因为awk支持浮点预算,且有它自己的printf语句。这样Shell程序中需要将浮点数值进行格式化的打印时,可使用小型的awk程序实现。然而,内建于bash、ksh93和zsh中的printf命令都支持浮点格式。

2、if...else语句

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

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

if ... else 语句的语法:

if [ expression ]
then
   Statement(s) to be executed if expression is true
fi

最后必须以fi来结尾闭合 if,fi就是 if 倒过来拼写,后面也会遇见。
注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。
示例:

a=10
b=20
if [ $a == $b ]
then
 echo "a、b相等"
fi

if [ $a != $b ]
then
echo "a、b不相等"
fi

输出

a、b不相等
if ... else ... fi 语句

if ... else ... fi语句的语法:

if [ expression ]
then
   Statement(s) to be executed if expression is true
else
   Statement(s) to be executed if expression is not true
fi

示例:

a=10
b=20
if [ $a == $b ]
then
 echo "a、b相等"
else
    echo "a、b不相等"
fi

输出:

a、b不相等
if ... elif ... fi 语句

if ... elif ... fi语句可以对多个条件进行判断,语法为:

if [ expression 1 ]
then
   Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
   Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
   Statement(s) to be executed if expression 3 is true
else
   Statement(s) to be executed if no expression is true
fi

示例:

a=10
b=20
if [ $a == $b ]
then
 echo "a等于b"
elif [ $a -gt $b ]
then
    echo "a大于b"
else
    echo "a小于b"
fi

输出:

a小于b

if ... else语句也可以写成一行,如果同一行有多条语句需要分号,以命令的方式来运行:

a=10
b=10
if test $a -eq $b; then echo 'a、b相等!'; fi;

if ... else语句也经常与test命令结合使用,如下所示:

a=$[2*3]
b=$[1+5]
if test $a -eq $b
then
    echo 'a、b相等!'
else
    echo 'a、b不等'
fi;

test 命令用于检查某个条件是否成立,与方括号([ ])类似

3、case ... esac 语句

case ... esac与其他语言中的 switch ... case语句类似,是一种多分枝选择结构。
case 语句匹配一个值或一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

case 值 in
模式1)
    command1
    command2
    command3
    ;;
模式2)
    command1
    command2
    command3
    ;;
*)
    command1
    command2
    command3
    ;;
esac

case工作方式如上所示。取值后面必须为关键字 in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至;;;; 与其他语言中的 break 类似,意思是跳到整个case语句的最后。

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。
示例:

#!/bin/sh
echo "请输入数字1~3"
read inputNum
case $inputNum in
    1) echo "输入的是1"
    ;;
    2) echo "输入的是2"
    ;;
    3) echo "输入的的3"
    ;;
    *) echo "无效数字"
    ;;
esac

输出:

请输入数字1~3
2
输入的是2

实例二:

#!/bin/sh
option="${1}"
case ${option} in
    -f) FILE="${2}"
    echo "File name is $FILE"
    ;;
    -d) DIR="${2}"
    echo "Dir name is $DIR"
    ;;
    *)
    echo "`basename ${0}`:usage: [-f file] | [-d directory]"
    exit 1 # Command to come out of the program with status 1
    ;;
esac

输出:

Daniels-MacBook-Pro:desktop chenzhichao$ ./test.sh -f fileName
File name is fileName
Daniels-MacBook-Pro:desktop chenzhichao$ ./test.sh -d directoryName
Dir name is directoryName

4、for循环

for循环一般格式为:

for 变量 in 列表
do
    command1
    command2
    ...
    commandN
done

列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。
in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。
示例一:

for num in 1 2 3 4
do
    echo "num is $num"
done

输出

num is 1
num is 2
num is 3
num is 4

示例二:

array=(1 2 3 4 5)
for a in ${array[*]}
do
    echo ${a}
done

输出:

1
2
3
4
5

实例三:

#顺序输出字符串中的字符
for c in 'hello world'
do
    echo $c
done

输出:

hello world

示例四

#查看当前目录有哪些jpg图片
currentDir=`pwd`
for file in ${currentDir}/*.jpg
do
    echo $file
done

输出:

/Users/chenzhichao/desktop/11.jpg

五、while循环

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

while command
do
   Statement(s) to be executed if command is true
done

示例:

num=5
while [ $num -gt 0 ]
do
    echo $num
    num=`expr $num - 1`
done

输出:

5
4
3
2
1

实例二:

echo "同时按ctrl+D结束"
echo "输入信息:"
while read message
do
    echo "信息:$message"
done

输出:

同时按ctrl+D结束
输入信息:
你好啊,**
信息:你好啊,**

六、until 循环

until循环执行一系列命令直至条件为true时停止。until 循环与 while循环在处理方式上刚好相反。一般while循环优于until循环,但在某些时候,也只是极少数情况下,until循环更加有用。
until 循环格式为:

until command
do
   Statement(s) to be executed until command is true
done

command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。
示例:

#!/bin/sh
a=0
until [ ! $a -lt 5 ]
do
    echo $a
    a=`expr $a + 1`
done

输出:

0
1
2
3
4

七、continue、break

在循环过程中,有时候需要在未达到循环结束条件时强制跳出循环,像大多数编程语言一样,Shell也使用 breakcontinue来跳出循环。

break命令

break命令允许跳出所有循环(终止执行后面的所有循环)。
示例:

echo "输入数字1~5,输入其他数字不做处理"
while read num
do
    if [ $num -gt 0 -a $num -lt 6 ]
    then
        echo "输入的是$num"
    else
        echo "无效字符,退出"
        break
    fi
done

输出:

输入数字1~5,输入其他数字不做处理
1
输入的是1
5
输入的是5
6
无效字符,退出

在嵌套循环中,break命令后面还可以跟一个整数,表示跳出第几层循环。例如:

break n

表示跳出第 n 层循环
示例

for var1 in 1 2 3
do
    for var2 in 0 5
    do
        if [ $var1 -eq 2 -a $var2 -eq 0 ]
        then
            break 2
        else
            echo "$var1 $var2"
        fi
    done
done

输出:

1 0
1 5
continue命令

continue命令与break命令类似,只有一点差别,它不会跳出所有循环,仅仅跳出当前循环。
示例:

for num in 1 2 3 4 5
do
    if [ $num == 3 ]
    then
        continue
    fi
echo "num is $num"
done

输出:

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

推荐阅读更多精彩内容