シェルスクリプトのwhileループ内の複数の条件が機能しません。

シェルスクリプトのwhileループ内の複数の条件が機能しません。

入力が空であってはならず、シェルスクリプトのwhileループに数字のみを含める必要があるマルチ条件チェックを実行しようとしていますが、これを試みている間にいくつかのエラーが発生します。私はいくつかのオプションを試しましたが、Unix StackexchangeとStack Overflowでこの問題に関するいくつかの質問を見ましたが、どちらも役に立ちませんでした。だからこの質問をここに投稿します。オプション1:

while [ \( -z "$account_number" \) && \( "$account_number" =~ "^[0-9]+$" \) ];
do      printf 'Input account Number RWDEx: '
        read -r account_number
        [ -z "$account_number" ]  && echo 'Account Number cannot be empty; try again.'
done

[: Missing `]'エラーが発生します。多くの人が条件と括弧の間の空白の問題のためにこのエラーを提案しましたが、うまくいきません。

オプション2:

while [[ -z "$account_number" && "$account_number" =~ "^[0-9]+$" ]]
do      printf 'Input account Number RWDEx: '
        read -r account_number
        [ -z "$account_number" ]  && echo 'Account Number cannot be empty; try again.'
done

上記の条件を与えると、入力を要求しません。

この問題を解決するのに役立ちます。私は #!/bin/bash を使用しています。スクリプトを#!/bin/bashの代わりに/bin/bashに変更してみました。

ベストアンサー1

ちょうど使用:

#! /bin/bash -
n=
pattern='^(0+|[123456789][0123456789]*)$' # decimal integer number,
                                          # exclude 0123 octals
until [[ $n =~ $pattern ]]; do
  IFS= read -rp 'Enter a decimal number: ' n || exit # exit upon EOF
done

または:

#! /bin/bash -
pattern='^(0+|[123456789][0123456789]*)$' # decimal integer number,
                                          # exclude 0123 octals
while true; do
  IFS= read -rp 'Enter a decimal number: ' n || exit # exit upon EOF
  if [ -z "$n" ]; then
    echo >&2 "Cannot be empty, try again"
  elif [[ ! $n =~ $pattern ]]; then
    echo >&2 "Not a decimal integer number, try again"
  else
    break
  fi  
done

あるいは、より良い方法は標準sh構文を使用することです。これにより、以下は必要ありませんbash

#! /bin/sh -
while true; do
  printf >&2 'Enter a number: '
  IFS= read -r n || exit # exit upon EOF
  case $n in
    ("")
      echo >&2 "Cannot be empty, try again";;
    (*[!0123456789]* | 0*[!0]*)
      echo >&2 "Not a decimal integer number, try again";;
    (*)
      break;; # OK
  esac
done

これは[組み込みシェルであることに注意してください。[of は演算子bashの逆zshであるか、演算子をyashサポートしません。=~

また、これは[ x && y ]解析されますので、cmd1 arg && cmd2 arg2実行して[ x成功したら実行してくださいy ]

[[ ... ]]一方、内部的に&&も形式の特殊なシェル構造(kshの)があります。そしてオペレーター。

しかし、次のように書くと:

[[ -z $var && $var =~ ^[0-9]+$ ]]

$varこれはnull()と一致するかどうかをテストすることで-z^[0-9]+$これは不可能です。

私の考えでは、あなたは次のことを意味すると思います:

[[ -z $var || ! $var =~ ^[0-9]+$ ]]

ただし、一致する場合 (0 ~ 9 の範囲の 1 つ以上の文字) 空にすることは-z $varできませんので重複します。$var^[0-9]+$

ほとんどのシステムのほとんどのロケールで一致するものは[0-9]多少ランダムであるため、[0123456789]小数点以下の桁数を一致させるにはを使用します。

などのシェルでは、bash通常はゼロの前にある数字を除外することをお勧めします。なぜなら、数字は8進数として解釈される傾向があるからです(例えば8の場合は010)。

bash'などのユーザープロンプトは、read -pコマンドの通常の出力(スクリプト出力)の一部ではないため、通常はstderrによって生成されます。生産するそうであれば、他のコマンドにパイプすることができます。)

おすすめ記事