Bash函数 - 未采用的函数中的第二个参数

时间:2017-12-12 10:19:33

标签: bash function parameters scripting subshell

出于某种原因,我无法将第二个参数传递给另一个文件上的函数,正好在这里:

$lsValidLocal | xargs -n 1 -I {} bash -c 'Push "{}" "**$inFolder**"

functions.sh 上的推送功能无法读取第二个参数 $ inFolder

我尝试了几种不同的方法,到目前为止唯一的工作方式是导出变量以使其可全局访问(虽然不是一个好的解决方案)

script.sh

#!/bin/bash
#other machine
export otherachine="IP_address_otherachine"

#folders
inFolder="$HOME/folderIn"

outFolder="$HOME/folderOut"

#loading functions.sh
. /home/ec2-user/functions.sh

export lsValidLocal="lsValid $inFolder"

echo $inFolder

#execution
$lsValidLocal  | xargs -n 1 -I {} bash -c 'Push "{}" "$inFolder"'

functions.sh

function Push() { 
        local FILE=$1
        local DEST=$2

        scp $FILE $otherachine:$DEST &&
        rm $FILE ${FILE}_0 &&
        ssh $otherachine "touch ${FILE}_0"
}

function lsValid() { #from directory
        local DIR=$1

        ls $DIR/*_0  | sed 's/.\{2\}$//'
}


export -f Push
export -f Pull
export -f lsValid

1 个答案:

答案 0 :(得分:1)

您编写的代码存在的问题是$inFolder位于单引号(')内,这会阻止它被展开。

$lsValidLocal  | xargs -n 1 -I {} bash -c 'Push "{}" "**$inFolder**"'

这将作为三个独立的流程层执行

bash <your scrpit>
|
\xargs ...
  |
  \bash -c Push ...

您的代码没有将值从外壳传递到内壳......但是您正在使用内壳扩展变量inFolder。正如您正确指出的那样,可以使用导出的环境变量来完成。

另一种方法是让外壳在传递给xargs之前展开它。

$lsValidLocal  | xargs -n 1 -I {} bash -c "Push '{}' '**$inFolder**'"

请注意,我已撤消'",以便在调用$inFolder之前展开xargs