シェルスクリプトでケースパラメータの後に他のパラメータが来る方法は?

シェルスクリプトでケースパラメータの後に他のパラメータが来る方法は?

ユーザー入力-sの後に数字が続くことを望みます(例-s 3:)。しかし、既存の変数の隣に他の変数を渡すことはできないようです-s。これは私のコードです。

echo choose
read choice 
       case $choice in 
       -a) echo you chose a 
        ;;
       -s $num) echo you chose the number $num #this is the -s number (e.g. -s 3) choice.
        ;;
      esac
exit 0

答え1

現在実行中のタスクを処理するより良い方法がほとんど確実です。まず、ユーザーに入力を要求するのを避け、代わりにプログラムを実行するときにコマンドラインに引数を与えるようにする必要があります。ただし、動作するようにコードを変更する必要があります。

read -rp 'choose: ' choice 
case $choice in 
    -a) echo 'you chose a';;
    -s\ [1-4]) "echo you chose the number ${choice#"-s "}";;
esac

変数numが設定されているように見えないため、nullに展開され、ケースパターンが単純になり、一致しません。-s )なぜなら-s 4-s )まあ、同じではないからです。そのため、-s\ [1-4])後に数字()が付くように修正する必要があります。次に、パラメータ拡張を使用してを削除します-s


私が処理する方法は、getopts次のようなものを使用することです。

#!/bin/bash

while getopts as: opt; do
    case $opt in
        a) printf '%s\n' 'You have chosen: a';;
        s) n=$OPTARG; printf '%s: %d\n' 'You have chosen s with an argument of' "$n";;
    esac
done

これにより、次のパラメータを指定してコマンドラインから実行できます。

./script.sh -s 4

関連情報