【问题标题】:Forcing string replacement in declared function of shell script在 shell 脚本的声明函数中强制字符串替换
【发布时间】:2022-01-07 06:45:15
【问题描述】:

我正在编写将一些文件移动到远程服务器的脚本(请参阅: Function calls in Here Document for unix shell script 了解更多详情)。为了允许脚本在本地机器和远程服务器上工作,我使用'declare -f' 来包装现有函数以远程执行。到目前为止,我想出了这个:

myscript.sh

REMOTE_HOST=myhost
TMP=eyerep-files

getMoveCommand()
{
    echo Src Dir: $2
    sudo cp ~/$TMP/start.ini ~/$1/start_b.ini
    
    ls ~/$2
    echo Target Dir: $1
    ls ~/$1
}

moveRemote()
{
    echo "attempting move with here doc"
    echo $(declare -fp getMoveCommand ) 
    ssh -t "$REMOTE_HOST" "$(declare -fp getMoveCommand); getMoveCommand ${1@Q} ${TMP@Q}"
}

moveFiles()
{   
        case "$1" in
      # remote deploy
      remote)
        moveRemote $2
        ;;
      # local deploy
      local)
        getMoveCommand $2
        ;;
      *)
        echo "Usage: myscript.sh {local|remote}"
        exit 1
        ;;
    esac
    
}

moveFiles $1 $2
exit 0

如果使用 './myscript.sh remote dev' 调用,脚本应该 ssh 进入远程服务器并将文件从一个文件夹移动到另一个文件夹。我遇到的问题是字符串替换。我有一堆全局变量充当 getMoveCommand 需要访问的常量。在此处的示例中,只有一个 (TMP),因此我可以简单地将其作为参数传递。然而,在实际脚本中,正在完成的工作更加复杂,并且需要传入的参数数量会使这个解决方案变得笨拙。由于这些变量永远不会改变,似乎应该可以在将包装函数发送到 ssh 之前强制进行字符串替换。

我想做的事情是否可行,如果可以,怎么办?如果没有,是否有另一种不需要向函数传递大量参数的方法来处理这个问题?

【问题讨论】:

    标签: bash function shell unix ssh


    【解决方案1】:

    如果导出变量,可以使用 envsubst:

    export TMP=foo
    
    getMoveCommand() {
            echo TMP is $TMP
    }
    
    declare -fp getMoveCommand|envsubst
    

    上面的脚本打印:

    getMoveCommand () 
    { 
        echo TMP is foo
    }
    

    【讨论】:

      【解决方案2】:

      你也可以使用declare -p发送全局变量:

      ssh -t "$REMOTE_HOST" "$(declare -fp getMoveCommand; declare -p GLOBAL_VAR_1 GLOBAL_VAR_2)"$'\n'"getMoveCommand ${1@Q} ${TMP@Q}"
      

      您还可以使用另一个全局变量来声明它们,以便轻松扩展它们:

      GLOBAL_VARS=(GLOBAL_VAR_1 GLOBAL_VAR_2)
      ...
      ssh -t "$REMOTE_HOST" "$(declare -fp getMoveCommand; declare -p "${GLOBAL_VARS[@]}")"$'\n'"getMoveCommand ${1@Q} ${TMP@Q}"
      

      如果你的变量有一个共同的前缀,你也可以通过"${!PREFIX@}"来扩展它们。无需存储到变量中。

      或者还不如创建一个“导出”功能来保持清洁:

      dump_env() {
          declare -fp getMoveCommand
          declare -p GLOBAL_VAR_1 GLOBAL_VAR_2
      }
      ...
      ssh -t "$REMOTE_HOST" "$(dump_env)"$'\n'"getMoveCommand ${1@Q} ${TMP@Q}"
      

      【讨论】:

        猜你喜欢
        • 2014-11-24
        • 1970-01-01
        • 1970-01-01
        • 2016-09-03
        • 2018-12-06
        • 2017-05-05
        • 2012-11-02
        • 2022-10-13
        • 2012-11-15
        相关资源
        最近更新 更多