Как я использую регулярные выражения в сценариях удара?

В моей системе (Ubuntu 17.10) ваш пример работает по желанию, как при вводе из командной строки (в sh), так и при исполнении сценария sh:

[bash]§ sh
$ STR="Hello\nWorld"
$ echo $STR
Hello
World
$ exit
[bash]§ echo "STR=\"Hello\nWorld\"
> echo \$STR" > test-str.sh
[bash]§ cat test-str.sh 
STR="Hello\nWorld"
echo $STR
[bash]§ sh test-str.sh 
Hello
World

Я думаю, это отвечает на ваш вопрос: он просто работает. (Я не пытался разобраться в деталях, например, в какой момент точно замена подписи символа новой строки для \n происходит в sh).

Однако я заметил, что этот же скрипт будет вести себя по-другому при выполнении с bash и вместо этого распечатайте Hello\nWorld:

[bash]§ bash test-str.sh
Hello\nWorld

Мне удалось получить желаемый результат с помощью bash следующим образом:

[bash]§ STR="Hello
> World"
[bash]§ echo "$STR"

Обратите внимание на двойные кавычки вокруг $STR. Это ведет себя одинаково, если сохраняется и выполняется как сценарий bash.

Следующее также дает желаемый результат:

[bash]§ echo "Hello
> World"
83
задан Hamish Downer 25 November 2008 в 20:06
поделиться

2 ответа

Это было изменено между 3,1 и 3.2:

Это - краткое описание новых опций, добавленных к удару 3.2 начиная с выпуска удара 3.1.

Заключение в кавычки аргумента строки к [[команда = ~ оператор теперь вызывает сопоставление строк, как с другими операторами сопоставления с образцом.

Так используют его без кавычек таким образом:

i="test"
if [[ $i =~ 200[78] ]] ; then
    echo "OK"
else
    echo "not OK"
fi
116
ответ дан paxdiablo 5 November 2019 в 16:40
поделиться

Нужны пробелы вокруг оператора =~

i="test"
if [[ $i =~ "200[78]" ]];
then
  echo "OK"
else
  echo "not OK"
fi
8
ответ дан 24 November 2019 в 08:55
поделиться
Другие вопросы по тегам:

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