予期しないEOFおよび構文エラー


9

現在、3度目のシェルスクリプトを書いていて、問題が発生しました。これはこれまでの私のスクリプトです:

#!/bin/bash
echo "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script"

while read  
do  
 case in  
        1) who;;  
        2) ls -a;;  
        3) cal;;  
        4) exit;;  
 esac    
done

スクリプトを実行しようとすると、次のようになります。

line2 : unexpected EOF while looking for matching '"'  
line14 : syntax error: unexpected end of file.    

何が悪いのですか?


1
きっとあなたは「ECF」ではなく「EOF」を意味するのですか?
l0b0 2014年

回答:


5

問題は、caseステートメントにサブジェクト(評価する必要のある変数)がないことです。したがって、おそらく次のようなものが必要です。

#!/bin/bash
cat <<EOD
choose one of the following options:
1) display all current users
2) list all files
3) show calendar
4) exit script
EOD

while true; do
    printf "your choice: "
    read
    case $REPLY in
        1) who;;
        2) ls -a;;
        3) cal;;
        4) exit;;
    esac    
done

ここでcaseは、変数名が指定されていない場合に満たされるデフォルトの変数$REPLYを使用しますread(詳細はhelp readを参照)。

また、変更点にも注意してください。これprintfは、各ラウンドでプロンプトを表示するために使用され(改行を追加しません)、cat折り返さず読みやすくするために、複数行に命令を印刷するために使用されます。


6

忘れないでくださいselect

choices=( 
    "display all current users" 
    "list all files" 
    "show calendar" 
    "exit script"
)
PS3="your choice: "
select choice in "${choices[@]}"; do
    case $choice in
        "${choices[0]}") who;;
        "${choices[1]}") ls -a;;
        "${choices[2]}") cal;;
        "${choices[3]}") break;;
    esac
done

1
これはこれまでで最もきれいな答えのように見えます。これは、OPが必要とするものを正確に実行するように設計されたselectを使用します。これは、選択肢を配列に入れます。これは、このようなデータを処理する優れた方法であり、スクリプトの他の場所で使用できるようにします。終了ではなくブレークを使用するため、この部分が完了した後、スクリプトは他のことを実行できます。
Joe

2

最初に1つのケースを試してみましょう。私が使用するread -p変数にユーザーの入力を読み取るためにopt以下のようにcase文が続きます。

#!/bin/bash
read -p "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script" opt
case $opt in
1) who;;
2) ls -a;;
3) cal;;
4) exit;;
esac

上記のスクリプトは正常に機能しますが、ユーザーがオプション4を押すまでユーザー入力を読み取ることができるように、ループに含める必要があると思います。

したがって、while以下のようにループでそれを行うことができます。opt初期値を0として変数を設定します。変数の値が0であるwhile限り、ループ内で繰り返し処理を行っていますopt(そのためoptcaseステートメントの最後で変数を0 にリセットします)。

#!/bin/bash
opt=0;
while [ "$opt" == 0 ]
do
read -p "choose one of the following options : \
  1) display all current users \
  2) list all files \
  3) show calendar \
  4) exit script" opt

case $opt in
1) who;;
2) ls -a;;
3) cal;;
4) exit;;
esac
opt=0
done

0

私は個人的に「while」をコードの最初に置きます。その後にを付けると、:必要な回数だけループすることができます。これは私がそれを書く方法です。

while :
do
    echo "choose one of the following options : \
      1) display all current users \
      2) list all files \
      3) show calendar \
      4) exit script"
    read string
    case $string in
        1)
            who
            ;;

その後、質問を続け、で終わる

esac
done
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.