組み込み値を生成するためのBashスクリプト

組み込み値を生成するためのBashスクリプト
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"

上記は私のコードの一部です。デフォルトでは、ユーザーが入力するファイルの上部(from〜login)に値を挿入し、ステートメントが現在表示されているものと正確に一致するlocal_dirまで残りの行を保持する方法を望みます。ENDMASTER

各行に単一引用符と二重引用符を使用して個別にコメントを付けましたが、bashスクリプトを実行すると常に最初からコマンドが完了し、base_name結果ファイルを開くと残りますtrap

私は初めてbashに触れたので、オンラインで何も見つけることができないので、どんな助けにも感謝します。

答え1

ここでは、パラメータの置き換えをどのようにオフにできますか? (望むよりwww.tldp.orgの例19-7詳細については。 )

おそらく、スクリプトは次のように良く見えます(たとえそれでも密度が高いですが)。

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"

これにより、どんなものでも逃げる必要はありません。

答え2

ドル記号の前にバックスラッシュを追加します。

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

など。

関連情報