シェルスクリプトで読み取ったユーザー入力に複数のパラメータがあるかどうかを確認するには?

シェルスクリプトで読み取ったユーザー入力に複数のパラメータがあるかどうかを確認するには?

私は以下を設定しましたread -p "What will you like to name the file name? " filename。ただし、ユーザーが複数の単語を入力すると、スクリプトがクラッシュします。ユーザー入力に複数の単語があるかどうかを検出するには?

すみません!コードは次のとおりです。

# provide option to rename the .ph file

while true do#ユーザーにファイル名を変更してコマンドラインパラメータを読み取るように求められます。 read -p "ファイル名を変更しますか? (Y/N)" Answer

# Handle user input
case $answer in
    [Yy]* ) 
    echo "Please enter a single word for file name. Otherwise the file name will be sequence.ph."
    read -p "What will you like to name the file name? " filename
    newname="$filename"
    mv sequence.ph $filename.ph
    echo "File has been renamed." 
    break
    ;;       

    [Nn]* )
    newname="$1_tree"
    mv sequence.ph $newname.ph
    echo "Output file will have default name $1_tree.ph"
    break
    ;;
    * )
    echo "Error: Invalid input."  
    echo "Please enter y/Y or n/N. "
    ;;
esac
done

ベストアンサー1

read読み取る変数が複数あるコマンドを指定すると、入力を単語に分割し、各変数の単語を保存しようとします。したがって、2つの変数を指定でき、2番目の変数に何もない場合は、複数の単語が入力されます。このような:

while true; do
    read -r -p "What will you like to name the file name? " filename extra    # $extra will contain any extra word(s)
    if [ -n "$extra" ]; then
        echo "One-word filenames only, please"
    else
        break    # Got a valid filename, so break out of the loop
    fi
done

注:バックスラッシュを使用して奇妙なことをするのを防ぐための-rオプションも追加しました。readおそらく必須ではありませんが、一般的には良い習慣です。

...しかし、複数の単語で構成されるファイル名は実際には問題ではありません。一部の高度なタスクでは、正しいタスクを実行するのが少し難しい場合があります(参照バッシュFAQ #20)、しかしデフォルトの目的では、変数参照の周りに二重引用符を入れることができます。このように:

cat "$filename"    # Works with multi-word filenames
cat $filename    # FAILS with multi-word filenames - don't do this

二重引用符変数参照は次のとおりです。全体的に良いアイデアです。したがって、複数の単語を含めることを許可しなくても(/予想)これを行う必要があります。shellcheck.net変数を二重引用符で囲む必要がある場所やその他の一般的なスクリプトエラー(options省略を含む-r)を指摘するのに慣れているので、readスクリプトを実行することをお勧めします。

おすすめ記事