如何循环/迭代字符串
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 shell 解决方案。您可以使用 printf
做同样的事情,允许使用 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'
如果这不是你要找的,我很困惑,请在一行中添加所需的任何其他信息。
关于linux - 遍历带路径的连接字符串 - 防止通配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43588726/