3

フォローアップの質問をすることについて、ここでどのようなポリシーがあるのか​​わかりません。プロトコルに違反している場合は、ご容赦ください。以前は bash でメニューを作成していました (ここ)

そしてこれまでのところ、私はそれを本当にうまく機能させています。コードはこちら。

while [[ 1 ]]
do
    cat -n "$dumpfile"
    read -p "Please make a selection, select q to quit: " choice
    case $choice in
            # Check for digits
    [0-9] )   dtvariable=$(sed -n "$choice"p "$dumpfile")
              $dtvariable            ;;
     q|Q)
         break
           ;;
      *)
           echo "Invalid choice"
           ;;
    esac
done

ただし、最大 9 個のメニュー アイテムに最適です。メニューは動的です。1 個のアイテム、20 個のアイテム、または 197 個のアイテムを持つことができます。[0-9] を [0-9][0-9] に変更して、12 かかるかどうかを確認しましたが、そうではありません。誰かが私を正しい道に導くことができますか? [0-9] の部分を削除して、q 以外のものをすべて取得できると思います。しかし、数字を探す方が良いのではないでしょうか?

前もって感謝します。

4

2 に答える 2

2

私はいくつかの検証を行い$choiceます:

case $choice in
     # Check for digits
    +([0-9]))
        lines=($(wc -l ))
        if (( choice > 0 && choice <= lines ))
        then
            dtvariable=$(sed -n "$choice"p "$dumpfile")
            $dtvariable            ;;
        fi
# etc.
于 2009-11-11T05:12:00.903 に答える
1

これが私が働かなければならないものです。主な違いは、shopt -s extglob拡張パターン マッチングを有効にする が追加され+([0-9])たことと、正規表現に相当する bash である patternが追加されたことです。[0-9]+

shopt -s extglob
while [[ 1 ]]
do
    read -p "Please make a selection, select q to quit: " choice
    case $choice in
            # Check for digits
    +([0-9]))  
         echo $choice ;;
     q|Q)
         break
           ;;
      *)
           echo "Invalid choice"
           ;;
    esac
done
于 2009-11-11T04:52:23.660 に答える