带参数的函数

helloJohn.sh

#!/bin/bash

greet() {
  local name="$1"
  echo "Hello, $name"
}

greet "John Doe"
# running above script
$ bash helloJohn.sh
Hello, John Doe
  1. 如果不以任何方式修改参数,则无需将其复制到 local 变量 - 只需 echo "Hello, $1"

  2. 你可以使用 $1$2$3 等来访问函数内部的参数。

    注意: 对于超过 9 的参数,$10 将不起作用(bash 将其读作 $ 1 0),你需要做 ${10}${11} 等等。

  3. $@ 指的是函数的所有参数:

    #!/bin/bash
    foo() {
      echo "$@"
    }
    
    foo 1 2 3 # output => 1 2 3
    

    注意: 你应该在 $@ 周围使用双引号,就像这里一样。

    省略引号将导致 shell 扩展通配符(即使用户专门引用它们以避免这种情况)并且通常会引入不受欢迎的行为甚至可能导致安全问题。

    foo "string with spaces;" '$HOME' "*"
    # output => string with spaces; $HOME *
    
  4. 对于默认参数,请使用 ${1:-default_val}。例如:

    #!/bin/bash
    foo() {
      local val=${1:-25}
      echo "$val"
    }
    
    foo     # output => 25
    foo 30  # output => 30
    
  5. 要求参数使用 ${var:?error message}

    foo() {
      local val=${1:?Must provide an argument}
      echo "$val"
    }