我必须在bash中写一个函数。该函数将需要大约7个参数。我知道我可以调用这样的函数:
function_name $arg1 $arg2
我可以参考我的参数像这样里面的函数:
function_name () { echo "Parameter #1 is $1" }
我的问题是,有没有更好的方式参考函数里面的参数?我可以避免$ 1,$ 2,$ 3,….事情,只需使用$ arg1,$ arg2,…?
有没有适当的方法,或者我需要重新分配这些参数到函数内的其他一些变量?例如。:
function_name () { $ARG1=$1 echo "Parameter #1 is $ARG1" }
任何例子将不胜感激。
这样做的常见方式是将参数分配给函数中的局部变量,即:
copy() { local from=${1} local to=${2} # ... }
另一个解决方案可能是getopt样式选项解析。
copy() { local arg from to while getopts 'f:t:' arg do case ${arg} in f) from=${OPTARG};; t) to=${OPTARG};; *) return 1 # illegal option esac done } copy -f /tmp/a -t /tmp/b
可悲的是,bash不能处理更多可读的长选项,例如:
copy --from /tmp/a --to /tmp/b
为此,你需要使用外部getopt程序(我认为只有在GNU系统上有长选项支持)或手动实现长选项解析器,例如:
copy() { local from to while [[ ${1} ]]; do case "${1}" in --from) from=${2} shift ;; --to) to=${2} shift ;; *) echo "Unknown parameter: ${1}" >&2 return 1 esac if ! shift; then echo 'Missing parameter argument.' >&2 return 1 fi done } copy --from /tmp/a --to /tmp/b
另见:using getopts in bash shell script to get long and short command line options
你也可以是惰性的,只是将“变量”作为参数传递给函数,例如:
copy() { local "${@}" # ... } copy from=/tmp/a to=/tmp/b
并且在函数中有$ {from}和$ {to}作为局部变量。
请注意,同样的问题适用于 – 如果一个特定的变量不被传递,它将从父环境继承。您可能想要添加“安全线”,如:
copy() { local from to # reset first local "${@}" # ... }
以确保$ {from}和$ {to}在未通过时将被取消设置。
如果非常糟糕的事情是你的兴趣,你也可以在调用函数时将参数指定为全局变量,例如:
from=/tmp/a to=/tmp/b copy
然后你可以在copy()函数中使用$ {from}和$ {to}。只要注意,你应该总是传递所有参数。否则,随机变量可能泄漏到函数中。
from= to=/tmp/b copy # safe to=/tmp/b copy # unsafe: ${from} may be declared elsewhere
如果你有bash 4.1(我认为),你也可以尝试使用关联数组。它将允许你传递命名参数,但它会是丑陋的。就像是:
args=( [from]=/tmp/a [to]=/tmp/b ) copy args
然后在copy(),你需要grab the array。