迭代通过与路径连接字符串 - 防止通配符
问题描述:
如何循环/通过串迭代迭代通过与路径连接字符串 - 防止通配符
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'
答
既然你拥有了它标记Linux
和Shell
我相信你想有一个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'
如果这不是你正在寻找的东西,他们我很困惑,请删除一行以及所需的任何附加信息。
答
你是一个输出遵循相当偏斜的道路。利用阵列和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
您的解决方案不会给出预期的输出..只是复制/粘贴你的代码和输出是:'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
在顶部添加'set -f'。 (要禁用路径名扩展) –
请将其添加到您的示例..我得到一个错误 – clarkk