これを行う一般的な方法は、関数内のローカル変数に引数を割り当てることです。
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
参照:bashシェルスクリプトでgetoptsを使用して、長いコマンドラインオプションと短いコマンドラインオプションを取得する
怠惰になることもでき、関数への引数として「変数」を渡すだけです。
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()
を取得する必要があります。