Script Bash para criar script com valores incorporados

2
su "$uname" -c "cat > ~/scripts/syncdownloads.sh <<ENDMASTER
"#!/bin/bash"
login="$flogin"
pass="$fpass"
host="$fhost"
remote_dir="$fremote_dir"
local_dir="$flocal_dir" 

base_name="$(basename "$0")"
lock_file="/tmp/$base_name.lock"
trap "rm -f $lock_file exit 0" SIGINT SIGTERM
if [ -e "$lock_file" ]
then
    echo "$base_name is running already."
    exit
else
    touch "$lock_file"
    lftp -p 22 -u "$login","$pass" sftp://"$host" << EOF
    set sftp:auto-confirm yes
    set mirror:use-pget-n 5
    mirror -c -P5 "$remote_dir" "$local_dir"
    quit
EOF
    rm -f "$lock_file"
    trap - SIGINT SIGTERM
exit
fi

ENDMASTER"

O acima é minha parte do meu código, basicamente eu quero uma maneira de inserir os valores na parte superior do arquivo que o usuário inseriu (de login a local_dir ), mas depois deixar o resto das linhas até a declaração ENDMASTER exatamente como aparecem agora.

Eu tentei comentar cada linha individualmente e junto com aspas simples e duplas, mas quando eu executo o script bash, ele sempre completa os comandos de base_name onwards independentemente e quando eu abro o arquivo gerado o resto fica em branco após trap .

Eu sou novo no bash, então qualquer ajuda seria muito apreciada, já que não consigo encontrar nada relevante on-line.

    
por Chris Gee 16.08.2017 / 17:35

2 respostas

4

Que tal transformar a substituição de parâmetros no documento here off? (Veja Exemplo 19-7 em www.tldp.org para mais detalhes. )

Talvez o seu script fique melhor assim (embora ainda seja bastante denso):

su "$uname" -c "cat > ~/scripts/syncdownloads.sh << 'ENDMASTER'
###### Using '$()' to create a sub shell so that we don't have to escape 
###### special characters.
$(
###### The parameter substitution is on here
cat <<INNERMASTER
#!/bin/bash
login="$flogin"
pass="$fpass"
host="$fhost"
remote_dir="$fremote_dir"
local_dir="$flocal_dir"

INNERMASTER

###### No parameter substitution
cat <<'INNERMASTER'
base_name="$(basename "$0")"
lock_file="/tmp/$base_name.lock"
trap "rm -f $lock_file exit 0" SIGINT SIGTERM
if [ -e "$lock_file" ]
then
    echo "$base_name is running already."
    exit
else
    touch "$lock_file"
    lftp -p 22 -u "$login","$pass" sftp://"$host" << EOF
    set sftp:auto-confirm yes
    set mirror:use-pget-n 5
    mirror -c -P5 "$remote_dir" "$local_dir"
    quit
    EOF
    rm -f "$lock_file"
    trap - SIGINT SIGTERM
    exit
fi

INNERMASTER
)
ENDMASTER"

Dessa forma, você não precisa escapar de nada.

    
por 16.08.2017 / 20:27
2

Preceda os cifrões com uma barra invertida:

lock_file="/tmp/\$base_name.lock"

e assim por diante.

    
por 16.08.2017 / 17:56