迭代通过与路径连接字符串 - 防止通配符

问题描述:

如何循环/通过串迭代迭代通过与路径连接字符串 - 防止通配符

exclude_args='' 
exclude='/var/www/bak/*/* /var/test' 
set -- "$exclude" 
shift 
for path; do 
    exclude_args="$exclude_args --exclude '$path'" 
done 
echo "$exclude_args" 

输出

--exclude '/var/www/bak/*/* /var/test' 

如何获得这样

--exclude '/var/www/bak/*/*' --exclude '/var/test' 

既然你拥有了它标记LinuxShell我相信你想有一个POSIX外壳的解决方案。你可以做同样的事情,允许正常的分词使用printf,正如Heemayl在他的回答中正确表明的那样,但没有数组。首先,如果你的系统允许您使用set -f防止路径扩展,使用方法:

#!/bin/sh 
set -f 
exclude_args="" 
exclude='/var/www/bak/*/* /var/test' 
printf " --exclude '%s'" $exclude 
printf "\n" 

如果您不能使用set -f不管什么原因,你将需要包装用单引号每个部件,以防止膨胀,可强制执行这与sed

#!/bin/sh 
exclude_args='' 
exclude='/var/www/bak/*/* /var/test' 
exclude="$(echo "$exclude" | sed -e "s/[ ]/' '/g" -e "s/\(^.*$\)/'\1'/")" 
printf " --exclude %s" $exclude 
printf "\n" 

注:$exclude没有引用作为参数printf是故意的。

如果你想捕捉到exclude_args变量输出,(和你的系统提供printf-v选项,你可以简单地使用printf -v形式,例如

#!/bin/sh 
exclude_args='' 
exclude='/var/www/bak/*/* /var/test' 
exclude="$(echo "$exclude" | sed -e "s/[ ]/' '/g" -e "s/\(^.*$\)/'\1'/")" 
printf -v exclude_args " --exclude %s" $exclude 
echo "$exclude_args" 

示例使用/输出

$ sh exargs.sh 
--exclude '/var/www/bak/*/*' --exclude '/var/test' 

如果这不是你正在寻找的东西,他们我很困惑,请删除一行以及所需的任何附加信息。

+0

您的解决方案不会给出预期的输出..只是复制/粘贴你的代码和输出是:'sh test.sh --exclude'/ var/www/bak/site/ini'--exclude'/ var/www/bak/site2/db'--exclude'/ var/www/bak/site2/ini'--exclude'/ var/www/bak/site2/site'--exclude'/ var/www/bak/site3/ini'' – clarkk

+0

在顶部添加'set -f'。 (要禁用路径名扩展) –

+0

请将其添加到您的示例..我得到一个错误 – clarkk

你是一个输出遵循相当偏斜的道路。利用阵列和printf

exclude=('/var/www/bak/*/*' '/var/test') 
printf -- '--exclude %s ' "${exclude[@]}" 
  • exclude=('/var/www/bak/*/*' '/var/test')把所需的内容作为阵列的元件exclude

  • printf -- '--exclude %s ' "${exclude[@]}"打印数组元素与琴弦--exclude在前面

要在最后得到一个换行符,添加一个echo

printf ...; echo 

例子:

$ exclude=('/var/www/bak/*/*' '/var/test') 

$ printf -- '--exclude %s ' "${exclude[@]}"; echo 
--exclude /var/www/bak/*/* --exclude /var/test 
+0

'exclude'是一个函数参数..你如何将字符串'/ var/www/bak/*/*/var/test'转换为'exclude =('/ var/www/bak/*/* ''/ var/test')'? – clarkk

+0

@clarkk在函数内执行'exclude =($ @)',所有的位置参数都会被'IFS'分割并成为数组元素... – heemayl

+0

你不明白..它的passd作为一个连接字符串..这些路径不是唯一的参数 – clarkk