내장된 값을 생성하기 위한 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"

등.

관련 정보