linux shell教程(三)

来源:互联网 发布:无主之地2中文补丁mac 编辑:程序博客网 时间:2024/05/22 09:40

Shell教程目录
    1.Shell简介
    2.几种常见的Shell
    3.Shell与编译型语言的差异
    4.什么时候使用Shell
    5.第一个Shell脚本
    6.Shell变量
    7.Shell特殊变量
    8.Shell替换
    9.Shell运算符
    10.Shell注释
    11.Shell字符串
    12.Shell数组
    13.Shell echo命令
    14.shell printf命令
    15.Shell if else语句
    16.Shell case esac语句
    17.Shell for循环
    18.Shell while循环
    19.Shell until循环
    20.Shell跳出循环
    21.Shell函数
    22.Shell函数参数
    23.Shell输入输出重定向
    24.Shell文件包含 

13.Shell echo命令

echo是Shell的一个内部指令,用于在屏幕上打印出指定的字符串。命令格式:

  1. echo arg
您可以使用echo实现更复杂的输出格式控制。

显示转义字符

  1. echo "\"It is a test\""
结果将是:
"It is a test"

双引号也可以省略。

显示变量

  1. name="OK"
  2. echo "$name It is a test"
结果将是:
OK It is a test

同样双引号也可以省略。

如果变量与其它字符相连的话,需要使用大括号({ }):
  1. mouth=8
  2. echo "${mouth}-1-2009"
结果将是:
8-1-2009

显示换行

  1. echo "OK!\n"
  2. echo "It is a test"
输出:
OK!
It is a test

显示不换行

  1. echo "OK!\c"
  2. echo "It is a test"
输出:
OK!It si a test

显示结果重定向至文件

  1. echo "It is a test" > myfile

原样输出字符串

若需要原样输出字符串(不进行转义),请使用单引号。例如:
  1. echo '$name\"'

显示命令执行结果

  1. echo `date`
结果将显示当前日期

从上面可看出,双引号可有可无,单引号主要用在原样输出中。

14.shell printf命令:格式化输出语句

printf 命令用于格式化输出, 是echo命令的增强版。它是C语言printf()库函数的一个有限的变形,并且在语法上有些不同。

注意:printf 由 POSIX 标准所定义,移植性要比 echo 好。

如同 echo 命令,printf 命令也可以输出简单的字符串:
  1. $printf "Hello, Shell\n"
  2. Hello, Shell
  3. $
printf 不像 echo 那样会自动换行,必须显式添加换行符(\n)。

printf 命令的语法:
printf  format-string  [arguments...]
format-string 为格式控制字符串,arguments 为参数列表。

printf()在C语言入门教程中已经讲到,功能和用法与 printf 命令类似,请查看:C语言格式输出函数printf()详解

这里仅说明与C语言printf()函数的不同:
  • printf 命令不用加括号
  • format-string 可以没有引号,但最好加上,单引号双引号均可。
  • 参数多于格式控制符(%)时,format-string 可以重用,可以将所有参数都转换。
  • arguments 使用空格分隔,不用逗号。

请看下面的例子:
  1. # format-string为双引号
  2. $ printf "%d %s\n" 1 "abc"
  3. 1 abc
  4. # 单引号与双引号效果一样
  5. $ printf '%d %s\n' 1 "abc"
  6. 1 abc
  7. # 没有引号也可以输出
  8. $ printf %s abcdef
  9. abcdef
  10. # 格式只指定了一个参数,但多出的参数仍然会按照该格式输出,format-string 被重用
  11. $ printf %s abc def
  12. abcdef
  13. $ printf "%s\n" abc def
  14. abc
  15. def
  16. $ printf "%s %s %s\n" a b c d e f g h i j
  17. a b c
  18. d e f
  19. g h i
  20. j
  21. # 如果没有 arguments,那么 %s 用NULL代替,%d 用 0 代替
  22. $ printf "%s and %d \n"
  23. and 0
  24. # 如果以 %d 的格式来显示字符串,那么会有警告,提示无效的数字,此时默认置为 0
  25. $ printf "The first program always prints'%s,%d\n'" Hello Shell
  26. -bash: printf: Shell: invalid number
  27. The first program always prints 'Hello,0'
  28. $

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

15.Shell if else语句

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

1) if ... else 语句

if ... else 语句的语法:
if [ expression ]then   Statement(s) to be executed if expression is truefi
如果 expression 返回 true,then 后边的语句将会被执行;如果返回 false,不会执行任何语句。

最后必须以 fi 来结尾闭合 if,fi 就是 if 倒过来拼写,后面也会遇见。

注意:expression 和方括号([ ])之间必须有空格,否则会有语法错误。

举个例子:
  1. #!/bin/sh
  2. a=10
  3. b=20
  4. if [ $a == $b ]
  5. then
  6. echo "a is equal to b"
  7. fi
  8. if [ $a != $b ]
  9. then
  10. echo "a is not equal to b"
  11. fi
运行结果:
a is not equal to b

2) if ... else ... fi 语句

if ... else ... fi 语句的语法:
if [ expression ]then   Statement(s) to be executed if expression is trueelse   Statement(s) to be executed if expression is not truefi
如果 expression 返回 true,那么 then 后边的语句将会被执行;否则,执行 else 后边的语句。

举个例子:
  1. #!/bin/sh
  2. a=10
  3. b=20
  4. if [ $a == $b ]
  5. then
  6. echo "a is equal to b"
  7. else
  8. echo "a is not equal to b"
  9. fi
执行结果:
a is not equal to b

3) if ... elif ... fi 语句

if ... elif ... fi 语句可以对多个条件进行判断,语法为:
if [ expression 1 ]then   Statement(s) to be executed if expression 1 is trueelif [ expression 2 ]then   Statement(s) to be executed if expression 2 is trueelif [ expression 3 ]then   Statement(s) to be executed if expression 3 is trueelse   Statement(s) to be executed if no expression is truefi
哪一个 expression 的值为 true,就执行哪个 expression 后面的语句;如果都为 false,那么不执行任何语句。

举个例子:
  1. #!/bin/sh
  2. a=10
  3. b=20
  4. if [ $a == $b ]
  5. then
  6. echo "a is equal to b"
  7. elif [ $a -gt $b ]
  8. then
  9. echo "a is greater than b"
  10. elif [ $a -lt $b ]
  11. then
  12. echo "a is less than b"
  13. else
  14. echo "None of the condition met"
  15. fi
运行结果:
a is less than b

if ... else 语句也可以写成一行,以命令的方式来运行,像这样:
  1. if test $[2*3] -eq $[1+5]; then echo 'The two numbers are equal!'; fi;

if ... else 语句也经常与 test 命令结合使用,如下所示:
  1. num1=$[2*3]
  2. num2=$[1+5]
  3. if test $[num1] -eq $[num2]
  4. then
  5. echo 'The two numbers are equal!'
  6. else
  7. echo 'The two numbers are not equal!'
  8. fi
输出:
The two numbers are equal!
test 命令用于检查某个条件是否成立,与方括号([ ])类似。

16.Shell 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 语句的最后。

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

下面的脚本提示输入1到4,与每一种模式进行匹配:
  1. echo 'Input a number between 1 to 4'
  2. echo 'Your number is:\c'
  3. read aNum
  4. case $aNum in
  5. 1) echo 'You select 1'
  6. ;;
  7. 2) echo 'You select 2'
  8. ;;
  9. 3) echo 'You select 3'
  10. ;;
  11. 4) echo 'You select 4'
  12. ;;
  13. *) echo 'You do not select a number between 1 to 4'
  14. ;;
  15. esac
输入不同的内容,会有不同的结果,例如:
Input a number between 1 to 4Your number is:3You select 3

再举一个例子:
  1. #!/bin/bash
  2. option="${1}"
  3. case ${option} in
  4. -f) FILE="${2}"
  5. echo "File name is $FILE"
  6. ;;
  7. -d) DIR="${2}"
  8. echo "Dir name is $DIR"
  9. ;;
  10. *)
  11. echo "`basename ${0}`:usage: [-f file] | [-d directory]"
  12. exit 1 # Command to come out of the program with status 1
  13. ;;
  14. esac
运行结果:
$./test.shtest.sh: usage: [ -f filename ] | [ -d directory ]$ ./test.sh -f index.htm$ vi test.sh$ ./test.sh -f index.htmFile name is index.htm$ ./test.sh -d unixDir name is unix$

17.Shell for循环

与其他编程语言类似,Shell支持for循环。

for循环一般格式为:
for 变量 in 列表do    command1    command2    ...    commandNdone
列表是一组值(数字、字符串等)组成的序列,每个值通过空格分隔。每循环一次,就将列表中的下一个值赋给变量。

in 列表是可选的,如果不用它,for 循环使用命令行的位置参数。

例如,顺序输出当前列表中的数字:
  1. for loop in 1 2 3 4 5
  2. do
  3. echo "The value is: $loop"
  4. done
运行结果:
The value is: 1The value is: 2The value is: 3The value is: 4The value is: 5

顺序输出字符串中的字符:
  1. for str in 'This is a string'
  2. do
  3. echo $str
  4. done
运行结果:
This is a string

显示主目录下以 .bash 开头的文件:
  1. #!/bin/bash
  2. for FILE in $HOME/.bash*
  3. do
  4. echo $FILE
  5. done
运行结果:
/root/.bash_history/root/.bash_logout/root/.bash_profile/root/.bashrc

18.Shell while循环

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:
while commanddo   Statement(s) to be executed if command is truedone
命令执行完毕,控制返回循环顶部,从头开始直至测试条件为假。

以下是一个基本的while循环,测试条件是:如果COUNTER小于5,那么返回 true。COUNTER从0开始,每次循环处理时,COUNTER加1。运行上述脚本,返回数字1到5,然后终止。
  1. COUNTER=0
  2. while [ $COUNTER -lt 5 ]
  3. do
  4. COUNTER='expr $COUNTER+1'
  5. echo $COUNTER
  6. done
运行脚本,输出:
12345

while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。
  1. echo 'type <CTRL-D> to terminate'
  2. echo -n 'enter your most liked film: '
  3. while read FILM
  4. do
  5. echo "Yeah! great film the $FILM"
  6. done
运行脚本,输出类似下面:
type <CTRL-D> to terminateenter your most liked film: Sound of MusicYeah! great film the Sound of Music

19.Shell until循环

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

until 循环格式为:
until commanddo   Statement(s) to be executed until command is truedone
command 一般为条件表达式,如果返回值为 false,则继续执行循环体内的语句,否则跳出循环。

例如,使用 until 命令输出 0 ~ 9 的数字:
  1. #!/bin/bash
  2. a=0
  3. until [ ! $a -lt 10 ]
  4. do
  5. echo $a
  6. a=`expr $a + 1`
  7. done
运行结果:
0123456789

20.Shell break和continue命令

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

break命令

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

下面的例子中,脚本进入死循环直至用户输入数字大于5。要跳出这个循环,返回到shell提示符下,就要使用break命令。
  1. #!/bin/bash
  2. while :
  3. do
  4. echo -n "Input a number between 1 to 5: "
  5. read aNum
  6. case $aNum in
  7. 1|2|3|4|5) echo "Your number is $aNum!"
  8. ;;
  9. *) echo "You do not select a number between 1 to 5, game is over!"
  10. break
  11. ;;
  12. esac
  13. done
在嵌套循环中,break 命令后面还可以跟一个整数,表示跳出第几层循环。例如:
  1. break n
表示跳出第 n 层循环。

下面是一个嵌套循环的例子,如果 var1 等于 2,并且 var2 等于 0,就跳出循环:
  1. #!/bin/bash
  2. for var1 in 1 2 3
  3. do
  4. for var2 in 0 5
  5. do
  6. if [ $var1 -eq 2 -a $var2 -eq 0 ]
  7. then
  8. break 2
  9. else
  10. echo "$var1 $var2"
  11. fi
  12. done
  13. done
如上,break 2 表示直接跳出外层循环。运行结果:
1 01 5

continue命令

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

对上面的例子进行修改:
  1. #!/bin/bash
  2. while :
  3. do
  4. echo -n "Input a number between 1 to 5: "
  5. read aNum
  6. case $aNum in
  7. 1|2|3|4|5) echo "Your number is $aNum!"
  8. ;;
  9. *) echo "You do not select a number between 1 to 5!"
  10. continue
  11. echo "Game is over!"
  12. ;;
  13. esac
  14. done
运行代码发现,当输入大于5的数字时,该例中的循环不会结束,语句
  1. echo "Game is over!"
永远不会被执行。

同样,continue 后面也可以跟一个数字,表示跳出第几层循环。

再看一个 continue 的例子:
  1. #!/bin/bash
  2. NUMS="1 2 3 4 5 6 7"
  3. for NUM in $NUMS
  4. do
  5. Q=`expr $NUM % 2`
  6. if [ $Q -eq 0 ]
  7. then
  8. echo "Number is an even number!!"
  9. continue
  10. fi
  11. echo "Found odd number"
  12. done
运行结果:
Found odd numberNumber is an even number!!Found odd numberNumber is an even number!!Found odd numberNumber is an even number!!Found odd number

0 0
原创粉丝点击