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

你可能感兴趣的:(shell脚本学习(三))