做的是,在功能分配參數局部變量的常用方法,即:
copy() {
local from=${1}
local to=${2}
# ...
}
另一種解決方案可能是getopt -style選項解析。
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
然後,你可以只使用${from}
和${to}
在copy()
函數內。只需注意,你應該總是通過所有參數。否則,隨機變量可能泄漏到函數中。
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。
使用'$ 1'和'$ ARG1'有什麼區別? –
@JonLin:我可以使用更直觀的名稱,而不是$ 1,$ 2。數字令人困惑。 – Bhushan
你真的需要七個強制參數嗎?一種常見的方法是儘可能多地將選項變爲選項,並在有意義的地方提供默認值。如果您不必記住大量參數的特定位置順序,即使大多數用戶會在大多數時間覆蓋默認值,它也使您的腳本更容易使用。 – tripleee