Considere o seguinte em um script 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!
E o seguinte conteúdo no arquivo de texto $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
Se eu digitar manualmente o comando grep -F 'for Our Special Task_4' /tmp/draft
, recebo a segunda linha no arquivo de texto de rascunho:
2019-11-21 08:14:10,509 Task ended: 'Success' for Our Special Task_4 -- Elapsed time: 11.0 seconds
Mas os últimos 2 comandos acima (dentro de um script bash) não imprimem nada!
Alguma ideia do porquê?
Aspas não são especiais depois que uma variável é expandida.
Assumindo que
TASKNAME
contémOur Special Task_4
, entãoSTOP_SEARCH_STR
é definido como'for Our Special Task_4'
, incluindo essas aspas. Isso é o que seusecho
shows.Quando você executa
grep -F "$STOP_SEARCH_STR" "$TEMP"/draft
, você está dandogrep
a string'for Our Special Task_4'
para procurar. Essa string não existe no arquivo, portanto, nenhuma linha corresponde egrep
não imprime nada.Remova as aspas, você não está procurando por elas:
Nota: você precisa das aspas duplas em torno da expansão da variável
"$str"
ou"$STOP_SEARCH_STR"
para evitar a divisão de palavras, consulte Por que meu script de shell engasga com espaços em branco ou outros caracteres especiais?Quando você digita manualmente o comando
grep -F 'for Our Special Task_4' /tmp/draft
, as aspas fazem parte da sintaxe do shell e removem efetivamente o significado especial dos espaços dentro delas. Isso é diferente de aspas dentro de uma variável que agem como caracteres comuns.Como um aparte: 1)
echo "$(somecmd)"
geralmente é redundante, você pode simplesmente executarsomecmd
diretamente. 2) Aqui:echo $("grep -F "$STOP_SEARCH_STR" "$TEMP"/draft")
, por causa de como as aspas envolvem o espaço em branco, você está tentando executar um comando chamadogrep -F 'for
. Você provavelmente deve receber um erro por isso:Você deve alterar esta linha:
para esta linha (sim, não são necessárias aspas simples, elas não são úteis):
E use esta linha no script (sim, citado como mostrado):
Se você quiser/precisar adicionar um echo (que é supérfluo e pode até causar problemas) use esta linha (sim, cite todas as expansões (variáveis e subshell)):