如何循环/迭代字符串

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变量中的输出,(并且您的系统为-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/

10-15 02:07