私は現在、文字列が変数に存在することを確認しています。
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つまたはすべてがリストから欠落している場合は1を返しますか?
- リストにまたは定義されたファイルがある場合は0を返しますか?
- 定義されたすべてのファイルがリストにある場合は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"