括号的使用总结

单括号、双括号、单方括号、双方括号

  • 单括号 () 没作用;
  • $() 是命令替换;
  • (()) 可以进行算数运算,c 语言风格的 for 命令;
  • 单方括号 [] 是测试命令,需要有空格
  • $[] 是数学运算,作用与 $(()) 一样,后者更常用;
  • $[[]] 是高级的字符串运算,需要有空格

数组

对其它 shell 而言,数组变量的可移植性并不好,应尽量减少使用。下面的例子在 zsh 中运行,结果就不一样。

  1. #!/bin/bash
  2. # 定义数组
  3. myarray=(one two three four)
  4. # one
  5. echo $myarray
  6. # one
  7. echo ${myarray[0]}
  8. # one two three four
  9. echo ${myarray[*]}
  10. myarray[2]=seven
  11. unset myarray[2]
  12. # one two four
  13. echo ${myarray[*]}
  14. # 这个位置是空的
  15. echo ${myarray[2]}
  16. # four
  17. echo ${myarray[3]}
  18. unset myarray
  19. # 空的
  20. echo ${myarray[*]}

函数

创建函数

  1. function name {
  2. commands
  3. }
  4. # 或者
  5. name() {
  6. commands
  7. }

注意,函数必需先定义,然后才能使用。

使用举例:

  1. #!/bin/bash
  2. # 使用函数
  3. function func1 {
  4. echo "This is an example of a function"
  5. }
  6. count=1
  7. while [ $count -le 5 ]
  8. do
  9. func1
  10. count=$((count+1))
  11. done
  12. # 会覆盖上面的定义
  13. function func1 {
  14. echo "This is another example"
  15. }
  16. func1

返回值

有三种方式获取:

第一,默认最后一个命令的退出状态码;

  1. #!/bin/bash
  2. # 不推荐使用
  3. func1() {
  4. echo "trying to display a non existent file"
  5. ls -l badfile
  6. }
  7. func1
  8. echo "The exit status is: $?"

第二,使用 return 命令;

  1. #!/bin/bash
  2. # 使用 return 命令
  3. # 有两点需要注意:
  4. # 1. 函数一结束就取返回值
  5. # 2. 退出状态码必须是 0~255
  6. function db1 {
  7. read -p "Enter a value: " value
  8. echo "doubling the value"
  9. return $((value * 2))
  10. }
  11. db1
  12. echo "The new value is $?"

第三,使用函数输出,推荐使用;

  1. #!/bin/bash
  2. function db1 {
  3. read -p "Enter a value: " value
  4. echo $((value * 2))
  5. }
  6. # 命令替换
  7. result=$(db1)
  8. echo "The new value is $result"

向函数传递参数

同脚本获取命令行参数一样,函数也使用 $1$9 … 获取参数。$0 是函数名。

  1. #!/bin/bash
  2. # 向函数传递参数
  3. function addem {
  4. if [ $# -eq 0 ] || [ $# -gt 2 ]
  5. then
  6. echo -1
  7. elif [ $# -eq 1 ]
  8. then
  9. echo $(($1 + $1))
  10. else
  11. echo $(($1 + $2))
  12. fi
  13. }
  14. echo "Adding 10 and 15: $(addem 10 15)"

在函数中使用变量

默认情况下,在脚本中定义的变量都是全局变量,在函数内外都可以使用。

  1. #!/bin/bash
  2. # 默认都是全局变量
  3. function db1 {
  4. value=$((value * 2))
  5. }
  6. read -p "Enter a value: " value
  7. db1
  8. echo The new value is: $value

声明局部变量,在变量前加上 local 关键字。

  1. #!/bin/bash
  2. # 定义局部变量
  3. function func1 {
  4. local temp=$((value+5))
  5. result=$((temp * 2))
  6. }
  7. temp=4
  8. value=6
  9. func1
  10. # 22
  11. echo "The result is $result"
  12. # 4
  13. echo "The temp value is $temp"

向函数传递数组

  1. #!/bin/bash
  2. # 给函数传递数组
  3. wrong() {
  4. echo "The parameters are: $@"
  5. thisarray=$1
  6. echo "The received array is ${thisarray[*]}"
  7. }
  8. myarray=(1 2 3 4 5)
  9. echo "The origin array is ${myarray[*]}"
  10. # 这种传递数组的方式不行
  11. wrong $myarray
  12. echo
  13. # 正确使用方法
  14. right() {
  15. echo "The parameters are: $@"
  16. # 在内部创建一个新的变量
  17. newarray=($(echo $@))
  18. echo "The received array is ${newarray[*]}"
  19. }
  20. right ${myarray[*]}
  21. # 结果是
  22. # The origin array is 1 2 3 4 5
  23. # The parameters are: 1
  24. # The received array is 1
  25. #
  26. # The parameters are: 1 2 3 4 5
  27. # The received array is 1 2 3 4 5

函数返回数组

递归

  1. #!/bin/bash
  2. # 递归
  3. # 计算一个数的阶乘
  4. function factorial {
  5. if [ $1 -eq 1 ]
  6. then
  7. echo 1
  8. else
  9. local temp=$(($1 - 1))
  10. local result
  11. result=$(factorial $temp)
  12. echo $((result * $1))
  13. fi
  14. }
  15. read -p "Enter value: " value
  16. result=$(factorial $value)
  17. echo "The factorial of $value is: $result"

创建库

创建库文件,然后在多个脚本中引用,方便函数重用。

示例库函数:

  1. cat myfuncs
  2. # my script functions
  3. function addem {
  4. echo $(($1 + $2))
  5. }
  6. function multem {
  7. echo $(($1 * $2))
  8. }
  9. function divem {
  10. if [ $2 -ne 0 ]
  11. then
  12. echo $(($1 / $2))
  13. else
  14. echo -1
  15. fi
  16. }

和环境变量一样,shell 函数仅在定义它的 shell 会话内有效。在命令行中运行 myfuncs 脚本,shell 会创建一个新的 shell 运行它,之后在当前的 shell 中也无法使用它:

  1. $ ./myfuncs
  2. $ addem 1 2
  3. bash: addem: command not found

source 命令会在当前 shell 上下文中执行命令,而不是创建一个新 shell。source 命令有一个快捷的别名,称作点操作符(dot operator)

  1. #!/bin/bash
  2. # 使用库函数
  3. # 这种方式不正确
  4. # ./myfunc
  5. # 使用这种方式执行
  6. . ./myfuncs
  7. result=$(addem 10 15)
  8. echo "The result is $result"

在命令行上使用库函数

在命令行上创建函数:

  1. $ function divem { echo $(($1 / $2));}
  2. $ divem 5 2
  3. 2
  4. $ function multem {
  5. > echo $(($1 * $2))
  6. > }
  7. $ multem 2 5
  8. 10

.bashrc 中定义函数,或者使用点操作符加载库函数。这样就可以在 shell 中是使用了。