我在变量中有两个目录,并有一个传递给函数的输入。当我通过函数的传入输入传递两个目录中包含空格的目录时,我得到一条返回的消息,该目录将目录分解到第一个空格; “ / 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"
答案 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"
;缺乏报价是不希望的单词拆分的直接原因。 样式/最佳做法更改:
function foo {
与ksh兼容; foo() {
与POSIX兼容; function foo() {
不兼容POSIX,也不兼容旧版ksh)local
中使用;这样,它们在调用时就不会意外更改全局范围内的变量。