有没有办法避免在bash中的位置参数?
我必须在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。 (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |