私はスクリプトでshift
shell()ステートメントを使用する方法を理解しています。sh
ただし、shift: can't shift that many
部分的にスクリプトを使用することはshift
次のとおりです。
#!/bin/sh
.
.
.
test_sample(){
while :; do
case "${1-}" in
.
.
a)
shift
case "${1-}" in
cmd1)
echo "Test"
cmd2)
echo "Test 2"
.
.
esac ;;
b)
shift
case "${1-}" in
cmd3)
echo "Test 3"
cmd4)
echo "Test 4"
.
.
esac ;;
esac
shift
done
return 0
}
test_sample "$@"
スクリプトは、コマンドライン引数を使用してコマンドラインから呼び出されます。予想される動作は./test_sample.sh a cmd2
「テスト2」出力を提供する必要があります。
誰でもこのエラーを解決する方法を教えてもらえますか?
よろしくお願いします!
PS:ここに欠けている情報があれば教えてください。
答え1
問題は、終了しないループがあり、代わりにshift
変換する引数がなくなったときに使用しようとしていることです。
修正されたコード:
#!/bin/sh
main () {
while [ "$#" -ne 0 ]; do
case $1 in
a)
case $2 in
cmd1) echo 'Test 1' ;;
cmd2) echo 'Test 2' ;;
*) echo 'error a' >&2; exit 1
esac ;;
b)
case $2 in
cmd3) echo 'Test 3' ;;
cmd4) echo 'Test 4' ;;
*) echo 'error b' >&2; exit 1
esac ;;
*) echo 'error' >&2; exit 1
esac
shift 2
done
}
main "$@"
これで、外部ループは残りのパラメータがあるかどうかをテストし、そうでない場合は終了します。
shift
また、ループの終わりで2つのパラメータのうち1つのみを実行し、それ以降のパラメータを検出する$1
ためにa
使用します。b
$2
次のコードは、正しいオプションに解析するために上記の内容を変更しますgetopts
。これでa
合計が変わるので、b
それぞれオプション引数を持つ-a
sums が必要です。-b
$ ./script -a cmd1 -bcmd3
Test 1
Test 3
#!/bin/sh
main () {
OPTIND=1
while getopts a:b: opt; do
case $opt in
a)
case $OPTARG in
cmd1) echo 'Test 1' ;;
cmd2) echo 'Test 2' ;;
*) echo 'error a' >&2; exit 1
esac ;;
b)
case $OPTARG in
cmd3) echo 'Test 3' ;;
cmd4) echo 'Test 4' ;;
*) echo 'error b' >&2; exit 1
esac ;;
*) echo 'error' >&2; exit 1
esac
done
}
main "$@"