スクリプトのためのBash演算子

スクリプトのためのBash演算子

個別に連携する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

おすすめ記事