Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/bash/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在bash脚本中用方括号中的范围扩展参数?_Bash_Command Line Arguments_Square Bracket - Fatal编程技术网

如何在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