bash - adiciona linha em branco ao heredoc via variável

0

Se eu estou usando este cenário em um script:

#!/bin/bash

addvline=$(if [ "$1" ]; then echo "$1"; echo; fi)

cat << EOF
this is the first line
$addvline
this is the last line
EOF

se $1 for emty, recebo uma linha em branco.
Mas como posso adicionar uma linha em branco depois de $1 para o caso de não ser emty?

Portanto, no caso de executar o script como: bash script.sh hello

Gostaria de receber:

this is the first line
hello

this is the last line

Tentei conseguir isso usando um segundo echo no if statement , mas a nova linha não foi aprovada.

    
por nath 01.10.2017 / 18:23

2 respostas

1

Deixar if decidir definir seu conteúdo variável para não usar a substituição de comando.

if [ "$1" ]; then addvline=$1$'\n'; fi

Então:

#!/bin/bash
if [ "$1" ]; then addvline=$1$'\n'; fi
cat << EOF
this is the first line
$addvline
this is the last line
EOF
    
por 01.10.2017 / 19:35
1

Existem várias soluções para isso. Primeiro, vamos criar uma variável que contenha uma nova linha para ser usada mais tarde (no bash):

nl=$'\n'

então ele pode ser usado para construir a variável a ser impressa:

#!/bin/bash
nl=$'\n'
if [ "$1" ]; then
    addvline="$1$nl"
else
    addvline=""
fi

cat << EOF
this is the first line
$addvline
this is the last line
EOF

Ou você pode evitar o if inteiramente se usar a expansão de parâmetro correta:

#!/bin/bash
nl=$'\n'
addvline="${1:+$1$nl}"

cat << EOF
this is the first line
$addvline
this is the last line
EOF

Ou, em um código mais simples:

#!/bin/bash
nl=$'\n'

cat << EOF
this is the first line
${1:+$1$nl}
this is the last line
EOF
    
por 01.10.2017 / 19:51