我正在撰寫一個 shell 腳本來移動一些檔案。該腳本需要能夠根據傳入的引數對本地計算機或遠程服務器上的檔案進行操作。我已經設法組合了一個簡單的函式來執行我想要的操作。我似乎無法弄清楚如何在 Here 檔案中使用該函式,以便它可以在遠程服務器上執行。我在這里發現了一個類似的問題:From shell script can we invoke function from here document但給出的答案對我不起作用。
這是我到目前為止的想法:
腳本檔案
REMOTE_HOST=myserver
JETTY_BASE=/opt/web/jetty
doMove()
{
echo "$JETTY_BASE/webapps/eyerep-data/$1"
sudo touch $JETTY_BASE/webapps/eyerep-data/$1/myfile
ls $JETTY_BASE/webapps/eyerep-data/$1;
}
moveRemote()
{
echo "attempting move with here doc"
ssh -t $REMOTE_HOST "/bin/bash <<EOF
$(doMove $1)
EOF"
}
moveFiles()
{
case "$1" in
# remote deploy
remote)
moveRemote $2
;;
# local deploy
local)
doMove $2
;;
*)
echo "Usage: myscript.sh {local|remote}"
exit 1
;;
esac
}
如果我運行上面的
./myscript.sh 遠程開發
我得到如下輸出:
attempting move with here doc
/bin/bash: line 1: /opt/web/jetty/webapps/eyerep-data/: Is a directory
/bin/bash: line 2: dev: command not found
/bin/bash: line 3: eyerep-data-dev.xml: command not found
/bin/bash: line 4: eyerep-data-local.xml: command not found
/bin/bash: line 5: local: can only be used in a function
查看輸出,它似乎試圖將 'echo' 和 'ls' 呼叫的輸出作為命令傳遞給 /bin/bash,而不是將它們列印到控制臺。雖然這是一個人為的例子,但我希望能夠在我的函式中包含列印到標準輸出的日志陳述句。處理這個問題的最佳方法是什么?
uj5u.com熱心網友回復:
試試這個:
#!/bin/bash
REMOTE_HOST=myserver
JETTY_BASE=/opt/web/jetty
generateMoveCommands() {
__="echo ${JETTY_BASE@Q}/webapps/eyerep-data/${1@Q}
sudo touch ${JETTY_BASE@Q}/webapps/eyerep-data/${1@Q}/myfile
ls ${JETTY_BASE@Q}/webapps/eyerep-data/${1@Q}"
}
moveLocal() {
generateMoveCommands "$1"
eval "$__"
}
moveRemote() {
echo "Attempting move with here doc"
generateMoveCommands "$1"
ssh -t "$REMOTE_HOST" "$__"
}
showUsage() {
echo "Usage: $0 {local|remote} file"
exit 1
}
main() {
case $1 in
# remote deploy
remote)
[[ $2 ]] || showUsage
moveRemote "$2"
;;
# local deploy
local)
[[ $2 ]] || showUsage
moveLocal "$2"
;;
*)
showUsage
;;
esac
}
main "$@"
該形式${param@Q}將 value 擴展為帶引號的版本,允許作為引數安全地重新評估。這是一個 Bash 功能,從 4.4 開始可用。
替代解決方案:
#!/bin/bash
REMOTE_HOST=myserver
JETTY_BASE=/opt/web/jetty
doMove() {
local jetty_base=$1 file=$2
echo "${jetty_base}/webapps/eyerep-data/${file}"
sudo touch "${jetty_base}/webapps/eyerep-data/${file}/myfile"
ls "${jetty_base}/webapps/eyerep-data/${file}"
}
moveRemote() {
echo "Attempting move with here doc"
ssh -t "$REMOTE_HOST" "$(declare -fp doMove)"$'\n'"doMove ${JETTY_BASE@Q} ${1@Q}"
}
showUsage() {
echo "Usage: $0 {local|remote} file"
exit 1
}
main() {
case $1 in
# remote deploy
remote)
[[ $2 ]] || showUsage
moveRemote "$2"
;;
# local deploy
local)
[[ $2 ]] || showUsage
doMove "$JETTY_BASE" "$2"
;;
*)
showUsage
;;
esac
}
main "$@"
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/404407.html
標籤:
上一篇:從讀取命令獲取值并分配給變數
