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"

上面是我的代码的一部分,基本上我想要一种方法将值插入用户输入的文件顶部(从loginlocal_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"

等等。

相关内容