入力が空であってはならず、シェルスクリプトの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によって生成されます。生産するそうであれば、他のコマンドにパイプすることができます。)