, если отрицательный или работает в bash ? [closed]

-1
14.08.2018, 14:06
4 ответа

Альтернативная реализация (не специфичная для bash -)

check_string() {
    case "$1" in  
        *abcd*|*xyz*) return 1 ;;
        *) return 0
    esac
}
check_string "$FILES"
0
28.01.2020, 05:07

Если первое условие всегда истинно, второе никогда не будет оцениваться.

Вы не упомянули содержание $FILES, но кажется, что $FILESникогда не похож на "abcd" и, таким образом, отрицание всегда истинно.

2
28.01.2020, 05:07

Ваш тест

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

в силу закона Де Моргана эквивалентно

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

Пока строка $FILESне соответствует обоим регулярным выражениям, проверка всегда будет истинной.

Также обратите внимание, что ваша функция не обязана явно возвращать единицу или ноль. Достаточно было бы

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

Статус выхода функции будет статусом последней выполненной команды в функции.


Если вы работаете со списком из имен файлов или путей, не сохраняйте их в виде строки. Это помешает вашему скрипту работать с именами файлов, содержащими пробелы. Вместо этого используйте правильный массив для хранения путей.

2
28.01.2020, 05:07

Думаю, это логическое недоразумение. Было бы хорошо, если бы вы сказали, что вы хотите сделать.

  1. вернуть 1, если один из определенных файлов отсутствует в списке?
  2. вернуть 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" ]];
0
28.01.2020, 05:07

Теги

Похожие вопросы