負の数、またはbashの関数であれば? [閉鎖]

負の数、またはbashの関数であれば? [閉鎖]

私は現在、文字列が変数に存在することを確認しています。

check_string() {
    if [[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]];
    then
        return 0
    else
        return 1
    fi
}
check_string

問題は、2番目の条件[[ ! "$FILES" =~ "xyz" ]]が評価されないことです。

ただし、これを否定しないと、2番目の条件が評価されます[[ "$FILES" =~ "xyz" ]]

check_string() {
    if [[ "$FILES" =~ "abcd" ]] || [[ "$FILES" =~ "xyz" ]];
    then
        return 0
    else
        return 1
    fi
}
check_string

どんなアイデアがありますか?

答え1

最初の条件が常に true の場合、2 番目の条件は評価されません。

言及されていない内容ですが、「abcd」と全く似ていないよう$FILESです$FILESので、否定は常に真です。

答え2

あなたのテスト

[[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]]

だからドモーガンの法則、同等

! [[ "$FILES" =~ "abcd" && "$FILES" =~ "xyz" ]]

文字列が$FILES正規表現と一致しない限り、テストは常に真です。

また、関数が明示的に1または0を返す必要はありません。十分だろう

check_string() {
    [[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]]
}

関数の終了状態は、関数内で実行された最後のコマンドの終了状態です。


リスト作業中の場合ファイル名または、パス名を文字列として保存しないでください。これにより、スクリプトがスペースを含むファイル名を処理できなくなります。代わりに、適切な配列を使用してパス名を保存してください。

答え3

私はこれが論理的な誤解だと思います。言いたいことを言えばいいと思います。

  1. 定義されたファイルの1つにリストがない場合は1を返しますか?
  2. 定義されたファイルの1つまたはすべてがリストから欠落している場合は1を返しますか?
  3. リストにまたは定義されたファイルがある場合は0を返しますか?
  4. 定義されたすべてのファイルがリストにある場合は0を返しますか?

Atm 両方の条件が実行されると言うことができます。

set -xスクリプトを入力すると、bashは評価された内容を印刷します。

$ cat check_string.sh
#!/usr/bin/env bash
set -x
check_string() {
if [[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]];
then
    return 0
else
    return 1
fi

これは私のチェックです。

$ FILES="abcd lmo xyz" ./check_string.sh                 
+ check_string
+ [[ ! abcd lmo xyz =~ abcd ]]
+ [[ ! abcd lmo xyz =~ xyz ]]
+ return 1
$ FILES="abcd lmo" ./check_string.sh    
+ check_string
+ [[ ! abcd lmo =~ abcd ]]
+ [[ ! abcd lmo =~ xyz ]]
+ return 0
$ FILES="lmo xyz" ./check_string.sh
+ check_string
+ [[ ! lmo xyz =~ abcd ]]
+ return 0
$ FILES="abcd" ./check_string.sh
+ check_string
+ [[ ! abcd =~ abcd ]]
+ [[ ! abcd =~ xyz ]]
+ return 0
$ FILES="lmo" ./check_string.sh
+ check_string
+ [[ ! lmo =~ abcd ]]
+ return 0
$ FILES="xyz" ./check_string.sh
+ check_string
+ [[ ! xyz =~ abcd ]]
+ return 0
}
check_string

また:条件をより明確に書くことができると思います。変化

if [[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]];

到着

if [[ ! "$FILES" =~ "abcd" || ! "$FILES" =~ "xyz" ]];

答え4

代替実装(bashに限定されない)

check_string() {
    case "$1" in  
        *abcd*|*xyz*) return 1 ;;
        *) return 0
    esac
}
check_string "$FILES"

関連情報