繁体   English   中英

从Shell脚本中的变量运行命令

[英]Run command from variables in shell script

我编写了这段代码,以扫描目录中比参考文件新的文件,同时排除特定的子目录。

#!/bin/bash

dateMarker="date.marker"
fileDate=$(date +%Y%m%d)
excludedDirs=('./foo/bar' './foo/baz' './bar/baz')
excludedDirsNum=${#excludedDirs[@]}

for (( i=0; i < $excludedDirsNum; i++)); do
    myExcludes=${myExcludes}" ! -wholename '"${excludedDirs[${i}]}"*'"
done

find ./*/ -type f -newer $dateMarker $myExcludes > ${fileDate}.changed.files

但是,排除项只是被忽略。 当我“ echo $ myExcludes”看起来很好时,如果我用echo命令的输出替换最后一行中的“ $ myExcludes”,脚本的行为将与预期的一样。 我猜这是某种引号/转义错误,但我无法消除它。

似乎是引用问题,请尝试使用数组:

#!/bin/bash

dateMarker=date.marker
fileDate=$(date +%Y%m%d)
excludedDirs=('./foo/bar' './foo/baz' './bar/baz')
args=(find ./*/ -type f -newer "$dateMarker")
for dir in "${excludedDirs[@]}"
do
    args+=('!' -wholename "$dir")
done
"${args[@]}" > "$fileDate.changed.files"

也许您还需要-prune

args=(find ./*/)
for dir in "${excludedDirs[@]}"
do
    args+=('(' -wholename "$dir" -prune ')' -o)
done
args+=('(' -type f -newer "$dateMarker" -print ')')

您需要myExcludes才能评估为以下内容:

\\(-name foo / bar -o -name foo / baz -o -name bar / baz \\)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM