проверка, содержится ли строка в другой строке в оболочке - PullRequest
1 голос
/ 15 марта 2019

если я запускаю это, он не печатает да.

if [s == [Ss]]
then echo "yes"
fi

Однако, если я напишу double [], это будет похоже на

if [[s == [Ss]]]
then echo "yes"
fi

, оно печатает да

Интересно, ПОЧЕМУ

Ответы [ 3 ]

1 голос
/ 15 марта 2019

Продолжая мой комментарий, POSIX-оболочка не позволяет использовать классы символов (например, [...]) в пределах test (синоним [...]). Только bash [[ ... ]] допускает классы символов внутри него.

Если у вас установлено coreutils (примерно для каждого дистрибутива), вы все равно можете сопоставить список символов со строкой, возвращающей индекс (на основе 1) в строке первого символа в символе список. Для вашего случая вы можете использовать:

if [ $(expr index "s" "sS") -gt '0' ]; then
    echo yes; 
fi

Где expr index "s" "sS" - это обычная форма index string charlist, которая требует использования expr перед ней.

Если вы ограничены оболочкой POSIX, вы можете использовать expr string : regex для сопоставления с регулярным выражением.

if [ $(expr "s" : '[sS]$') -gt '0' ]; then
    echo yes; 
fi

( примечание: регулярное выражение должно соответствовать всему содержимому проверяемой строки)

0 голосов
/ 16 марта 2019

[ не поддерживает сопоставление с образцом.Используйте case вместо.

inp=s

case $inp in
  [sS]) echo "Matched s/S" ;;
  *) echo "Did not match s/S" ;;
esac
0 голосов
/ 15 марта 2019

При сравнении строк синтаксис с двойными скобками имеет глобальную оболочку. Как вы пытаетесь сравнить как верхний и нижний регистр. Также синтаксис с двойными скобками помогает в сопоставлении с образцом регулярных выражений. Условие, которое вы дали, похоже на

if [[ "$stringvar" == *string* ]]; then

Это означает, что звездочка (“*”) расширится буквально до чего угодно, как вы, вероятно, знаете из обычного использования командной строки. Следовательно, if $stringvar везде содержит фразу “string”, условие вернет true. Допускаются и другие формы срыва оболочки. Если вы хотите сопоставить “String” и “string”, вы можете использовать следующий синтаксис:

if [[ "$stringvar" == *[sS]tring* ]]; then
...