Bash

用於創建嵌入值的腳本的 Bash 腳本

  • August 17, 2017
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 的新手,所以任何幫助都將不勝感激,因為我在網上找不到任何相關的東西。

關閉此處文件中的參數替換如何?(有關更多詳細資訊,請參見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"

這樣你就不必逃避任何事情。

引用自:https://unix.stackexchange.com/questions/386469