関数で使用しようとしてもgetops
機能しないようです。
#!/bin/bash
function main()
{
while getopts ":p:t:c:b:" o; do
case "${o}" in
p)
echo "GOt P"
p=$OPTARG
;;
t)
echo "GOt T"
t=$OPTARG
;;
c)
echo "GOt C"
c=$OPTARG
;;
b)
echo "GOt b"
b=$OPTARG
;;
*)
#usage
echo "Unknown Option"
return
;;
esac
done
echo $p
echo $t
echo $c
echo $b
}
main
次に、次のように実行します。
$ ./bin/testArguments.sh -p . -t README.md -c 234 -b 1
optidがローカルであることを確認しようとしましたが、それも機能しませんでした。別の問題がある可能性がありますか?
答え1
関数にmain
パラメータを渡しません。関数がスクリプトに渡されたのと同じ引数を取得するには、次のように渡します。
main "$@"
変える:
main
また、スクリプトに関連しています。
- 「function foo(){}」と「foo(){}」の違い
- なぜprintfがechoより優れているのですか?
- bash / POSIXシェルで変数を引用することを忘れてしまうセキュリティリスク
- stderrでエラーを印刷したい:
echo >&2 Unknown option
- エラーが発生した場合は、ゼロ以外の終了ステータスを返そうとします(
return 1
)。 - 関数を呼び出すときに以前に呼び出された場合(たとえば、関数が以前に呼び出された場合)に備えて、最初に1に
getopts
設定することをお勧めします。OPTIND
getopts
答え2
関数では、引数はスクリプトに渡された引数ではなく、関数に渡された引数です。
$ cat foo.sh
function main ()
{
echo "$@"
}
echo "$@"
main
$ bash foo.sh bar
bar
$
"$@"
次のアドレスに転送する必要がありますmain
。
main "$@"
同じスクリプトで関数を呼び出し続けない限り、スクリプトmain
の関数はそれほど役に立たないと思います。main