4

私の bash スクリプトは、ユーザーが 2 つの数字を入力したかどうかを確認することになっています。各番号の前に a+または-記号を付ける必要があります。最初の数字は 4 桁、2 番目の数字は 5 桁である必要があります。

入力した値に関係なく、出力は常にFail

スクリプトを実行するコマンドライン ステートメント:

$me add +1234 -12345

スクリプト:

#!/bin/bash
#Script name add
if [ $1 != [\+\-][0-9][0-9][0-9][0-9] ] || 
   [ $2 != [\+\-][0-9][0-9][0-9][0-9][0-9] ]
  then
    echo Fail
else    
    echo Success
fi
4

3 に答える 3

3

POSIX スタイルのテスト ( [) は、パターン マッチングをまったく実行しません。演算子は!=文字列比較です。ksh スタイルのテスト ( [[)) は、演算子を使用して通常のシェル パターンとのパターン マッチングを実行し、 を使用して==ERE マッチングを実行し=~ます。(ありません!=~が、DeMorganify は可能です)

! [[ $1 =~ [-+][[:digit:]]{4} && $2 =~ [-+][[:digit:]]{5} ]]

POSIX sh でパターン マッチングを実行するには、唯一のオプションはcaseステートメントです。

于 2012-10-14T12:41:53.960 に答える
1

従来のプログラミング言語により類似した高度な機能を有効にするには、二重角かっこを使用する必要があります。たとえば、の代わりに、およびの代わりに||使用-o&&ます-aパターン(マッチング)を実行するには、二重角かっこも必要です

また、角かっこは、各部分式に個別にではなく、式全体||に使用する必要があり、を含める必要があります。

私は次のような行を使用します:

if [[ $1 == [+-][0-9][0-9][0-9][0-9] && 
      $2 == [+-][0-9][0-9][0-9][0-9][0-9] ]]
  then
    echo "success"
else
    echo "fail"
fi

編集:(なぜそれほど否定的であるのか?)==の代わりに使用し、正規表現への参照を削除します(パターンマッチングを使用します)。!=

于 2012-10-13T19:45:55.623 に答える
1

ステートメントを使用してパターンマッチングを行う方法はないと思います(私は間違っていました、方法があります)。そのようなことに使用することができます。実例:ifcase

#!/bin/bash

#Script name add

case $1 in
    [+-][0-9][0-9][0-9][0-9]) r1='success' ;;
    *) r1='fail' ;;
esac
case $2 in
    [+-][0-9][0-9][0-9][0-9][0-9]) r2='success' ;;
    *) r2='fail' ;;
esac

if [ $r1 = 'fail' ] || [ $r2 = 'fail' ]
then
    echo Fail
else
    echo Success
fi
于 2012-10-13T19:10:00.207 に答える