Как сравнить строку со строкой подстановочного знака в сценарии оболочки?

Внутри [[.. ]]оператор =на самом деле является сопоставлением с шаблоном, поэтому [[ $1 != *[!0-9]* ]]проверяет, не соответствует ли значение $1шаблону *[!0-9]*.

Шаблоны, используемые здесь, такие же, как и для расширения имени файла, поэтому *соответствует любому символу, а [abc]любому символу в квадратных скобках, а [!abc]или [^abc]любому символу , а не . ] в квадратных скобках (, за исключением начального !или^). По сути, это проверяет, содержит ли $1некоторый символ, не являющийся цифрой, от 0до 9.


declare -i varпометит переменную varкак целочисленную переменную, :присвоения ей будут интерпретироваться как в арифметическом контексте, поэтому declare -i a; a=3+5; echo $a;выведет 8. Но вы не можете использовать это для позиционного параметра, например $1. Вместо этого declare -i $1возьмет строку, содержащуюся в $1, и использует , что , в качестве имени переменной. (Обратите внимание, что в declare -i aвыше нет $.)

На самом деле вы не можете использовать declare -iдля проверки того, является ли что-то числом, поскольку строки в арифметическом контексте воспринимаются как имена переменных . Это не ошибка:declare -i a; b=1+2; a=b; echo $a;. Вместо этого он печатает 3, что может быть, а может и не быть тем, что вам нужно.

-1
22.04.2020, 15:50
2 ответа

убедитесь, что вы используете или или , затем

if [[ "NPER20200422TEST.PTN" == NPER*.PTN ]]

Используйте условное обозначение в виде двойной скобки, а специальные подстановочные метасимволы не должны быть заключены в кавычки.

2
19.03.2021, 02:26

Вы можете распечатать свой оператор с echoи передать его вgrep:

if echo NPER20200422TEST.PTN | grep -q "NPER.*PTN"
then
  echo "File matched"
else
  echo "File not matched"
fi

grep -qне будет производить вывод

-1
19.03.2021, 02:26

Теги

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