linux - 遍历带路径的连接字符串 - 防止通配

标签 linux shell debian

如何循环/迭代字符串

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 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/

相关文章:

debian - 有没有 Debian 软件包目录

linux - 有没有办法在 Linux 中将参数分组到命令中?

linux - 如果由 bash 执行,如何使批处理脚本退出?

linux - 如何在 Ubuntu 中更改文件权限

linux - 如何将附加字段附加到 CSV 文件中的每一行?

cmake更新,找不到版本

mysql - 如何在 Debian Buster 中安装 mysql Workbench?

linux - (bash) 如何找到文件系统支持的最大文件大小?

linux - 为脚本创建引用

linux - 如何从父进程获取子进程