カットから得られた数値を比較するBashスクリプト

カットから得られた数値を比較するBashスクリプト

私はこのような文字列を持っています

"Hello catch these numbers 20 30"

私は持っています:

NUMBER_ONE=$(echo "$line" | cut -d' ' -f5)
NUMBER_TWO=$(echo "$line" | cut -d' ' -f6)

比較するとエラーが発生しますif [ "$NUMBER_ONE" -gt "$NUMBER_TWO" ];。整数式が必要です。どうすれば解決できますか?

ベストアンサー1

変数に次のものlineが含まれているとします。正確に表示される内容は二重引用符を含めます$NUMBER_TWO30"これは明らかに整数ではありません。

代わりに、

line='"Hello catch these numbers 20 30"'

if [[ $line =~ ([[:digit:]]+)" "([[:digit:]]+) ]]; then
    NUMBER_ONE=${BASH_REMATCH[1]}
    NUMBER_TWO=${BASH_REMATCH[2]}

    if (( NUMBER_ONE > NUMBER_TWO )); then
        echo NUMBER_ONE is greater than NUMBER_TWO
    else
        echo NUMBER_ONE is not greater than NUMBER_TWO
    fi
fi

これは正規表現を使用して、スペースで区切られた2つの(正の)整数を数値の部分文字列と一致させ、比較を実行します。次の二重引用符は30一致しません。


標準ツールボックスのツールを引き続き使用するには、変数を割り当てるときに変数から数値以外のすべてのアイテムを削除してくださいtr。前のコードを少し修正してください。

NUMBER_ONE=$(cut -d' ' -f 5 <<<"$line" | tr -dc '[:digit:]' )
NUMBER_TWO=$(cut -d' ' -f 6 <<<"$line" | tr -dc '[:digit:]' )

または後で代替品を使用するかbash

NUMBER_ONE=$(cut -d' ' -f 5 <<<"$line" ); NUMBER_ONE=${NUMBER_ONE//[![:digit:]]/}
NUMBER_TWO=$(cut -d' ' -f 6 <<<"$line" ); NUMBER_TWO=${NUMBER_TWO//[![:digit:]]/}

負の数を処理する必要がある場合は、マイナス記号を削除しないでください(そして、上記の最初のスニペットの正規表現一致では、最初のマイナス記号も許可する必要があります)。

おすすめ記事