如何在bash脚本中用方括号中的范围扩展参数?
我想使用包含数字的字符串作为脚本的输入。这个列表可能相当长,并且可能包含连续的数字范围,因此我考虑使用如何在bash脚本中用方括号中的范围扩展参数?,bash,command-line-arguments,square-bracket,Bash,Command Line Arguments,Square Bracket,我想使用包含数字的字符串作为脚本的输入。这个列表可能相当长,并且可能包含连续的数字范围,因此我考虑使用ls样式列表规范。但是,如何在脚本中展开此列表? 更具体地说,我想运行: myscript node-[2,5-7,10-13] 并且能够在我的脚本中循环节点2、节点5、节点6等 更新:似乎我需要在列表中使用花括号和点。我可以将字符串转换为该字符串,但如何使脚本将其视为列表?我能做的是: nodelist=`echo $1 | sed 's/\[/\{/' | sed 's/\]/\}/' |
ls
样式列表规范。但是,如何在脚本中展开此列表?
更具体地说,我想运行:
myscript node-[2,5-7,10-13]
并且能够在我的脚本中循环节点2、节点5、节点6等
更新:似乎我需要在列表中使用花括号和点。我可以将字符串转换为该字符串,但如何使脚本将其视为列表?我能做的是:
nodelist=`echo $1 | sed 's/\[/\{/' | sed 's/\]/\}/' | sed 's/-/../'`
但是对于输入节点[1-3]
例如,我得到:
>echo $nodelist
node{1..3}
请使用
您可以将其嵌套,使其更短
myscript node-{2,{5..7},{10..13}}
你是说像这样的事吗 $echo节点-{2,{5..7},{10..13} 节点-2节点-5节点-6节点-7节点-10节点-11节点-12节点-13 编辑 您可以将范围重新设置为bash友好: 回音'[2,5-7,10-13]'| sed-e's:[[[](.[]):{\1}:'-e:([0-9]+)[-]([0-9]+):{\1..\2}:g' {2,{5..7},{10..13}
如果列表中只有一项,即字符串中没有逗号,那么在开始和结束处都会出现双大括号,这使得bash展开它时有点难看。考虑下面的内容,基本上使用前面的例子:
# eval echo $(echo '[2,5-7,10-13]'|sed -r 's:\[(.*)\]:{\1}:;s:([0-9]+)-([0-9]+):{\1..\2}:g')
2 5 6 7 10 11 12 13
# eval echo $(echo '[10-13]'|sed -r 's:\[(.*)\]:{\1}:;s:([0-9]+)-([0-9]+):{\1..\2}:g')
{10} {11} {12} {13}
如果在字符串中没有逗号的情况下去掉前大括号和后大括号,则其性能会更好:
# eval echo $(echo '[2,5-7,10-13]'|sed -r 's:\[(.*)\]:{\1}:;s:([0-9]+)-([0-9]+):{\1..\2}:g;s:^\{([^,]*)\}$:\1:')
2 5 6 7 10 11 12 13
# eval echo $(echo '[10-13]'|sed -r 's:\[(.*)\]:{\1}:;s:([0-9]+)-([0-9]+):{\1..\2}:g;s:^\{([^,]*)\}$:\1:')
10 11 12 13
这可能行得通,但我想用方括号保留输入。我想我可以重新格式化脚本中的输入以符合这一点。我更新了我的问题。编辑了我的答案,添加了一些如何转换范围的示例。是的,我想到了这一点,只有你的解决方案看起来更好,并且能够处理第一个破折号。但是我如何扩展结果?顺便说一句,您的命令在s命令的RHS上给出了一个
无效引用\1。明白了。它需要额外的-r
选项来使用反向引用。我关于扩大转换范围的问题仍然存在,明白了吗<代码>评估
执行任务:)
# eval echo $(echo '[2,5-7,10-13]'|sed -r 's:\[(.*)\]:{\1}:;s:([0-9]+)-([0-9]+):{\1..\2}:g;s:^\{([^,]*)\}$:\1:')
2 5 6 7 10 11 12 13
# eval echo $(echo '[10-13]'|sed -r 's:\[(.*)\]:{\1}:;s:([0-9]+)-([0-9]+):{\1..\2}:g;s:^\{([^,]*)\}$:\1:')
10 11 12 13