0

私が書いている小さなスクリプトへのユーザー入力を検証しようとしています。2つの引数があり、最初の引数は「mount」または「unmount」である必要があります。

私は次のものを持っています:

if [ ! $# == 2 ] || [ $1 != "mount" -o $1 != "unmount" ]; then

しかし、私が望む条件を満たすには少しやり過ぎのようです。たとえば、現在の|| 演算子、バリデーターを通過するものはありませんが、&&演算子を使用するとすべてが通過します。

if [ ! $# == 2 ] && [ $1 != "mount" -o $1 != "unmount" ]; then

誰かが私がこれを理解するのを手伝ってもらえますか?

これがブロック全体と使用目的です

if [ ! $# == 2 ] || [ $1 != "mount" -o $1 != "unmount" ]; then
  echo "Usage:"
  echo "encmount.sh mount remotepoint       # mount the remote file system"
  echo "encmount.sh unmount remotepoint   # unmount the remote file system"
  exit
fi
4

1 に答える 1

1

あなたはこのようにそれを行うことができます:

if [ "$#" -ne 2 ] || [ "$1" != "mount" -a "$1" != "unmount" ]; then
    echo "Usage:"
    echo "encmount.sh mount remotepoint       # mount the remote file system"
    echo "encmount.sh unmount remotepoint   # unmount the remote file system"
    exit -1
fi
echo "OK" 

との両方に$1等しくない場合はusageブランチに入る必要があるため、テストで小さな論理エラーが発生します。また、数値をand演算子(ここを参照)と比較するか、を使用する必要があります。"mount""unmount"-eq-ne(( ))

test[ ])内で変数を引用符で囲む必要があることに注意してください

次のように2つの式を組み合わせることもできます。

if [ "$#" -ne 2 -o \( "$1" != "mount" -a "$1" != "unmount" \) ]; then

bashを使用している場合は、次の[[ ]]構文を使用することもできます。

if [[ $# -ne 2 || ( $1 != "mount" && $1 != "unmount" ) ]]; then
于 2013-02-27T08:10:47.083 に答える