为何shell for循环列表不能成功解析xargs中的变量呢?

发布于 2022-09-04 08:37:53 字数 520 浏览 15 评论 0

配置表中有一个黑名单的标签列表 是这样保存的 如 1-3,7-9

想把它展开成 1,2,3,7,8,9

如下所示

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 "1-3,7-9" | sed 's/-/../g'
1..3,7..9 
# 确定能够正确识别@
echo "1-3,7-9" | sed 's/-/../g' | xargs -I@ echo @
1..3,7..9
# 将@变量放到for中 报错
echo "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'

请问错在哪呢? 正确的写法是?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

美人如玉 2022-09-11 08:37:55

参考了@傅易君的答案 可以使用如下的命令

# 将逗号换成了换行
# Mac 对换行需要特殊处理
echo "1-3,7-9" | sed -e 's/-/../g' -e 

还是用awk更简单

# 对11这种孤儿值也友好
echo "1-3,7-9,11,13-17" | awk '{n=split($0,a,","); for(i=1;i<=n;i++){m=split(a[i],a2,"-");for(j=a2[1];j<=a2[m];j++){print j}}}' | tr '\n' ','
s/,/\\\n/g' | xargs -I@ echo 'for i in {@}; do echo -n "$i,"; done' | bash # Linux 换行无需转义 echo "1-3,7-9" | sed -e 's/-/../g' -e 's/,/\n/g' | xargs -I@ echo 'for i in {@}; do echo -n "$i,"; done' | bash

还是用awk更简单

你的呼吸 2022-09-11 08:37:53

先抛开 do 的问题,

你试试:

$ echo "1..3,7..9" | xargs -I @ echo [@]
[1..3,7..9]

然后试试:

$ echo "1..3,7..9" | xargs -d "," -I @ echo [@]
[1..3]
[7..9]

楼主你 xargs 没有把输入切开。

然后看:

$ echo "1..3,7..9" | xargs -d "," -I @ echo "for i in {@}; do; echo -n \"$i,\"; done"
for i in {1..3}; do; echo -n "$i,"; done
for i in {7..9}; do; echo -n "$i,"; done
$ echo "1..3,7..9" | xargs -d "," -I @ echo "for i in {@}; do; echo -n \"\$i,\"; done" | sh
1,2,3,7,8,9,

好像 mac 不支持 xargs-d 参数,有点苦恼。

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文