Оценка строки Bash неясна

Оценка строки Bash неясна

Рассмотрим следующее в скрипте bash:

STOP_SEARCH_STR="'""for $TASKNAME""'"
echo $STOP_SEARCH_STR               # prints 'for Our Special Task_4'
echo "$STOP_SEARCH_STR"             # prints 'for Our Special Task_4'
echo "grep -F "$STOP_SEARCH_STR" "$TEMP"/draft" # prints grep -F 'for Our Special Task_4' /tmp/draft
echo "$(grep -F "$STOP_SEARCH_STR" "$TEMP"/draft)"  # prints nothing!
echo $("grep -F "$STOP_SEARCH_STR" "$TEMP"/draft")  # prints nothing!

И следующее содержимое в текстовом файле $TEMP/draft:

2019-11-21 08:13:58,825 Task started: 'Our Special Task_4' of type 'Our - Special Task' 
2019-11-21 08:14:10,509 Task ended: 'Success' for Our Special Task_4 -- Elapsed time: 11.0 seconds

Если явручнуюнабираю команду grep -F 'for Our Special Task_4' /tmp/draft, получаю вторую строку в черновом текстовом файле:

2019-11-21 08:14:10,509 Task ended: 'Success' for Our Special Task_4 -- Elapsed time: 11.0 seconds

Но последние 2 команды выше (внутри bash-скрипта) ничего не выводят!

Есть идеи почему?

решение1

Кавычки не имеют особого значения после раскрытия переменной.

Предполагая, TASKNAMEчто содержит Our Special Task_4, тогда STOP_SEARCH_STRустанавливается в 'for Our Special Task_4', включая эти кавычки. Это то, что вы echoпоказываете.

Когда вы запускаете grep -F "$STOP_SEARCH_STR" "$TEMP"/draft, вы указываете grepстроку 'for Our Special Task_4'для поиска. Эта строка не существует в файле, поэтому ни одна строка не совпадает и grepничего не печатает.

Уберите кавычки, вы их не ищете:

task="Our Special Task_4"
str="for $task"
grep -F "$str" "$TEMP/draft"

Примечание: выделатьнужны двойные кавычки вокруг расширения переменной "$str"или "$STOP_SEARCH_STR"для предотвращения разбиения слов, см.Почему мой скрипт оболочки тормозит пробелы и другие специальные символы?

Когда тывручнуювведите команду grep -F 'for Our Special Task_4' /tmp/draft, кавычки являются частью синтаксиса оболочки и эффективно удаляют особое значение пробелов внутри них. Это отличается от кавычек внутри переменной, которые действуют как обычные символы.


В качестве отступления: 1) echo "$(somecmd)"обычно избыточно, вы можете просто запустить somecmdнапрямую. 2) Здесь: echo $("grep -F "$STOP_SEARCH_STR" "$TEMP"/draft"), из-за того, как кавычки окружают пробел, вы пытаетесь запустить команду с именем grep -F 'for. Вы, вероятно, должны получить ошибку для этого:

$ echo $("grep -F "$STOP_SEARCH_STR" "$TEMP"/draft")
bash: grep -F 'for: command not found

решение2

Вам следует изменить эту строку:

STOP_SEARCH_STR="'""for $TASKNAME""'"

к этой строке (да, одинарные кавычки не нужны, они бесполезны):

STOP_SEARCH_STR="for $TASKNAME"

И используйте эту строку в скрипте (да, именно так, как показано):

grep -F "$STOP_SEARCH_STR" "$TEMP"/draft

Если вы хотите/должны добавить эхо (что излишне и может даже вызвать проблемы), используйте эту строку (да, заключите в кавычки все расширения (переменные и подоболочку)):

echo "$(grep -F "$STOP_SEARCH_STR" "$TEMP"/draft")"

Связанный контент