我有一个黑名单来保存标签 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 获取特殊关键字和字符( do
、for
、$
等),您的意思是由 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/