Альтернативная реализация (не специфичная для bash -)
check_string() {
case "$1" in
*abcd*|*xyz*) return 1 ;;
*) return 0
esac
}
check_string "$FILES"
Если первое условие всегда истинно, второе никогда не будет оцениваться.
Вы не упомянули содержание $FILES
, но кажется, что $FILES
никогда не похож на "abcd" и, таким образом, отрицание всегда истинно.
Ваш тест
[[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]]
в силу закона Де Моргана эквивалентно
! [[ "$FILES" =~ "abcd" && "$FILES" =~ "xyz" ]]
Пока строка $FILES
не соответствует обоим регулярным выражениям, проверка всегда будет истинной.
Также обратите внимание, что ваша функция не обязана явно возвращать единицу или ноль. Достаточно было бы
check_string() {
[[ ! "$FILES" =~ "abcd" ]] || [[ ! "$FILES" =~ "xyz" ]]
}
Статус выхода функции будет статусом последней выполненной команды в функции.
Если вы работаете со списком из имен файлов или путей, не сохраняйте их в виде строки. Это помешает вашему скрипту работать с именами файлов, содержащими пробелы. Вместо этого используйте правильный массив для хранения путей.
Думаю, это логическое недоразумение. Было бы хорошо, если бы вы сказали, что вы хотите сделать.
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" ]];