個別に連携する2つのスクリプトがありますが、一緒に機能させる方法がわかりません。
使命は、bashスクリプトが演算子と整数のリストを受け入れ、コマンドにアクションを実行させることです。
デフォルトではスクリプトを使用できる必要があります。
test.sh add 1 2 3
5
test.sh sub 4 2 1
1
私の最初のスクリプトは
for var in $@
do
sum=$(( sum + var ))
done
echo $sum
2番目のスクリプトは
if [ $operator = add ]; then
add= echo $(($a+$b))
elif
ベストアンサー1
スクリプトは、最初のコマンドライン引数を別の変数として選択し、コマンドライン引数のリストからop
削除します。
#!/bin/sh
op=$1
shift
このスクリプトをadd 1 2 3
引数として使用すると、コードは文字列add
をに割り当ててop
保持します。1 2 3
"$@"
その後、残りのコマンドライン引数を繰り返すことができます。
#!/bin/sh
op=$1
shift
for arg do
# some commands should go here
done
追加されたループは、変数が残りのarg
各コマンドライン引数の値を順番に取るようにします。このようにループの先頭を作成することもできますが、for arg in "$@"; do ...
より多くの入力が必要になり、プログラマは時々引用符を追加することを忘れます$@
。
値によっては、$op
ループ内で複数のアクションのいずれかが発生する可能性があります。私たちは$op
それが何であるかを確認し、正しいことをするために簡単なテストをすることができます。いずれにしても、下にいくつかの値が累積され、acc
そのacc
値は(質問にコマンドが表示される方法に応じて)最初の数字で初期化され、その数字もパラメータリストから削除する必要があります。
#!/bin/sh
op=$1
shift
acc=$1
shift
for arg do
case $op in
add) acc=$(( acc + arg )) ;;
sub) acc=$(( acc - arg )) ;;
mul) acc=$(( acc * arg )) ;;
div) acc=$(( acc / arg )) ;; # note: integer division here
*)
printf 'Unknown operation: %s\n' "$op" >&2
exit 1
esac
done
printf '%s\n' "$acc"
スクリプトを保存し、実行可能にしてテストします。
$ ./script add 1 2 3
6
$ ./script sub 4 2 1
1
$ ./script xor a b c
Unknown operation: xor
$ ./script add
script[7]: shift: nothing to shift
最後の2回の呼び出しに注意してください。最後は数字を提供しないので、2番目はshift
失敗します。 2番目の呼び出しは、ジョブが不明であることを知らせ、早期に終了します。
op
割り当てと初期化を少し変更すると、acc
エラーメッセージをより便利にすることができます。
#!/bin/sh
op=${1:?Expected operator}
shift
acc=${1:?Expected number}
shift
for arg do
case $op in
add) acc=$(( acc + arg )) ;;
sub) acc=$(( acc - arg )) ;;
mul) acc=$(( acc * arg )) ;;
div) acc=$(( acc / arg )) ;; # note: integer division here
*)
printf 'Unknown operation: %s\n' "$op" >&2
exit 1
esac
done
printf '%s\n' "$acc"
もう一度テストしてください:
$ ./script
script[3]: 1: Expected operator
$ ./script add
script[6]: 1: Expected number
$ ./script add 1 2
3
これらのエラーメッセージの正確な形式は、システム内のシェルの役割によって異なります/bin/sh
。