如何循环/迭代字符串
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
变量中的输出,(并且您的系统为-v
提供printf
选项,您可以简单地使用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'
如果这不是你要找的,他们我很困惑,删除一行任何额外的信息需要。
关于linux - 遍历带路径的串联字符串-防止乱码,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/43588726/