echo come as novas linhas quando você não usa aspas.
EDIT: Veja comentário, não é ecoado falha.
Você já encontrou a melhoria
echo "$VAR_1"
Agora faça o mesmo para o documento aqui:
echo "'cat <<EOF
$VAR_1
EOF'"
Eu criei o shell script, que efetua login no servidor FTP e renomeia alguns diretórios. Eu coloquei comandos FTP em cadeia de múltiplas linhas como assim
# !/bin/sh
ftp -inv $HOST << EOF
user $USER $PASSWORD
$COMMANDS
bye
EOF
o $COMMANDS
contém comandos separados por nova linha. Essa abordagem funciona, quando eu construo o comando assim
NL=$'\n'
COMMANDS="command one$NL"
COMMANDS+="command two$NL"
COMMANDS+="command three"
Em primeiro lugar, tentei preencher $COMMANDS
com a função printf
, mas mesmo depois de várias tentativas, não obtive êxito. A expressão
COMMANDS="$(printf "%s\n" "command one" "command two" "command three")"
avaliado como string com espaços em branco entre os comandos e quando usado no script como comando FTP, foi processado como uma única linha.
Eu tentei substituir \n
por \r
, o que resulta na variável $COMMANDS
não sendo preenchida com nenhuma string.
Alguém mais instruído por favor me explica, qual é o problema com a função printf
aqui?
Eu gerenciei como alcançar meu objetivo via rsync, então a abordagem de FTP que abandonei, mas ainda estou curioso para saber por que isso acontece.
O problema é com o armazenamento de printf
na variável. Fiz script de teste:
echo "==== printf directly"
printf "%s\n" "foo" "bar" "baz"
echo "==== stored in variable"
VAR_1=$(printf "%s\n" "foo" "bar" "baz")
echo $VAR_1
executando ./test.sh
outputs
==== printf directly
foo
bar
baz
==== stored in variable
foo bar baz
definir IFS=$'\n'
não ajuda.
Eu posso obter multilinha da variável se eu envolvê-lo em qotes duplos
echo "$VAR_1"
mas não consigo obter o mesmo resultado se usado dentro do heredoc
echo 'cat <<EOF
$VAR_1
"$VAR_1"
EOF'
Eu recebo saída
foo bar baz "foo bar baz"
nota: não há sequer uma nova linha entre os dois outputs variáveis em heredoc, o que também é estranho para mim.
echo come as novas linhas quando você não usa aspas.
EDIT: Veja comentário, não é ecoado falha.
Você já encontrou a melhoria
echo "$VAR_1"
Agora faça o mesmo para o documento aqui:
echo "'cat <<EOF
$VAR_1
EOF'"
Tags bash