将带空格的变量传递给函数

时间:2019-05-14 14:25:55

标签: bash terminal

我在变量中有两个目录,并有一个传递给函数的输入。当我通过函数的传入输入传递两个目录中包含空格的目录时,我得到一条返回的消息,该目录将目录分解到第一个空格; “ / Volumes / Backup / SMC”,并且找不到

rootinput="/Volumes/Backup/SMC Media Backup/"
rootoutput="/Volumes/Backup/SMC Frameio/"

        function doPROGRAM(){
    export -f doMOVE
    selectprogram=$1
    rtout="$rootoutput$selectprogram"
    find "$rootinput$selectprogram"/Media -type f -mtime -60  -exec bash -c 'doMOVE $0 '"\"$(rtout)\"" {}   \;
    }
    doPROGRAM "Freedom House"

1 个答案:

答案 0 :(得分:4)

写得正确,看起来可能像这样:

rootInput="/Volumes/Backup/SMC Media Backup/"
rootOutput="/Volumes/Backup/SMC Frameio/"

doMove() {
  printf 'Moving %q to %q\n' "$1" "$2"
}
export -f doMove

doProgram() {
  local rtOut selectProgram
  selectProgram=$1
  rtOut="$rootOutput$selectProgram"

  find "$rootInput$selectProgram"/Media -type f -mtime -60 \
    -exec bash -c 'for arg do doMove "$arg" "$rtOut"; done' _ {} +;
}
doProgram "Freedom House"

相关更改:

  • 以前使用的是每个找到的文件运行bash的一个副本,这里我们使用-exec ... {} +在命令行中传递尽可能多的内容,并使用for arg do在它们上进行迭代(同义词为for arg in "$@"; do)。
  • 您最初在$0上未加引号的位置,在这里我们引述"$arg";缺乏报价是不希望的单词拆分的直接原因。

样式/最佳做法更改:

  • 根据https://pubs.opengroup.org/onlinepubs/9699919799/basedefs/V1_chap08.html中记录的POSIX准则,我们对自己的变量使用小写字母名称,不使用保留的全大写名称空间,该名称空间用于对Shell本身和其他POSIX指定的工具有意义的名称。 / li>
  • 我们要避免混合使用POSIX和ksh函数声明语法,如https://wiki.bash-hackers.org/scripting/obsolete中所述(function foo {与ksh兼容; foo() {与POSIX兼容; function foo() {不兼容POSIX,也不兼容旧版ksh)
  • 我们明确声明了在函数中分配的变量,以供在这些函数local中使用;这样,它们在调用时就不会意外更改全局范围内的变量。