
Рассмотрим следующее в скрипте 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")"