shell - 为什么 shell for expression 无法正确解析 xargs 参数

标签 shell for-loop xargs

我有一个黑名单来保存标签 ID 列表,例如1-3,7-9,实际上代表的是1,2,3,7,8,9。并且可以通过下面的 shell 来扩展它

for i in {1..3,7..9}; do for j in {$i}; do echo -n "$j,"; done; done
1,2,3,7,8,9

但首先我应该将 - 转换为 ..

echo -n "1-3,7-9" | sed 's/-/../g'
1..3,7..9

然后将其作为参数放入for表达式中

echo -n "1-3,7-9" | sed 's/-/../g'  | xargs -I @ for i in {@}; do for j in {$i}; do echo -n "$j,"; done; done
zsh: parse error near `do'

echo -n "1-3,7-9" | sed 's/-/../g'  | xargs -I @ echo @
1..3,7..9

但是for表达式无法正确解析,为什么会这样呢?

最佳答案

因为您没有采取任何措施来阻止最外层 shell 获取特殊关键字和字符( dofor$等),您的意思是由 xargs 运行。

xargs 不是内置的 shell;它从它的参数中获取您希望它为标准输入上的每个元素运行的命令行。就像任何其他程序一样,如果您希望 ; 或任何其他特殊序列在参数中成为 bash,您需要以某种方式转义它。

在我看来,您真正想要的似乎是在子 shell 中为每个输入元素调用一个命令(您的嵌套 for 循环)。

我想出了这个;看来对这份工作来说:

echo -n "1-3,7-9" \
| sed 's/-/../g'  \
| xargs -I @  \
bash -c "for i in {@}; do for j in {\$i}; do echo -n \"\$j,\"; done; done;"

给出:

{1..3},{7..9},

关于shell - 为什么 shell for expression 无法正确解析 xargs 参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41294406/

相关文章:

python - 为什么我不能通过 fabric 与 redis-cli 交互?

linux - 从 sh 文件发送命令并通过 ssh 保持登录状态

java - Shell 脚本运行 Java Jar 服务

python - 使用 Python 执行 shell 脚本?

awk - 根据新行将列转为行

javascript - 无法更改多个类名

C++ If 在 for 循环中循环。限制

javascript - 在 "for"循环中填充多维数组 (javascript)

Linux xargs 命令

python - GNU Parallel 替换管道 xargs -n 1