私は今bashシェルスクリプトを書いていますが、仕様の1つは、最初の引数$ 1が-eまたは-dでない場合はエラーメッセージを印刷する必要があることです。これが私がしたことです。
if [ "$1" != "-e" ] || [ "$1" != "-d" ]; then
echo "Error: First argument must be either -e or -d"
exit 1
fi
ただし、-eまたは-dを最初の引数として使用しても、このエラーメッセージは引き続き印刷されるため、これは機能しないようです。私は何が間違っていて、どのように解決できますか?
答え1
その場合、最初の条件はtrueです$1
。-d
その場合、2番目の条件はtrueです$1
。-e
どちらも本当です。合流してから||
(または)、これそれから枝もしどちらかが本当なら受け入れなさい。したがって、それから支店は常に占有されています。
if [ "$1" != "-e" ] && [ "$1" != "-d" ]
使用する必要がありますそれから$1
そうでない場合にのみ分岐-e
そしていいえ-d
。
答え2
case $1 in
-d) ;; # nothing to do
-e) ;; # nothing to do
*)
echo 'Error: First argument must be either -e or -d' >&2
exit 1
esac
これは、または他の場合exit 1
にトリガーされます。$1
-d
-e
または、使用されたオプションとそれに対して行われた操作に基づいてフラグを設定します(私は別々に保つ傾向があります)。分析するコマンドラインオプションは次のとおりです。パフォーマンスそのうち):
case $1 in
-d) dflag=1 ;;
-e) dflag=0 ;;
*)
echo 'Error: First argument must be either -e or -d' >&2
exit 1
esac
# Getting here means:
# - $1 was either -d or -e
# - $dflag will show which one it was
if [ "$dflag" -eq 1 ]; then
# act on -d option
else
# act on -e option
fi
〜のようにかっちゅが解明した、あなたの問題は(欠落した二重引用符に加えて)論理(ブール演算)の1つです。上記では、タスクを実行する別の方法を示しました。case
...esac
ステートメントは通常、コマンドラインオプションを処理するために使用されます。