【发布时间】:2012-09-19 22:14:26
【问题描述】:
我希望能够让用户输入:
./script.sh server[01-10]type
我已经得到了这个,并且可以与 [a-z] 或 [0-99] 一起使用,或者它的数值很高。虽然我真的不确定我是否以正确的方式去做,以及是否有更简单的方法来做同样的事情。
想检查是否有更简单的方法来做这样的事情,以及有多个通配符输入有多容易,例如:
./script.sh (server|web)[01-10][a-z]
然后它将解析 web01-10a-z 或 server01-10a-z 并列出所有服务器。
这是我目前所拥有的,我承认我需要整理它,但我想在专注于更整洁的代码调用之前让它更好地工作。
#!/bin/bash
input=$1;
if [[ $input =~ \[ ]];then
s="["
f="]"
host_start=`echo $input|awk -F"[" '{print $1}'`
host_end=`echo $input|awk -F"]" '{print $2}'`
start=`awk -v a="$input" -v b="$s" 'BEGIN{print index(a,b)}'`
fin=`awk -v a="$input" -v b="$f" 'BEGIN{print index(a,b)}'`
vals=`expr $fin - $start`
((start++))
((vals--))
in1=`echo $input| awk -v s=$start -v f=$vals '{ print substr( $0, s($0),f($0) ) }'`
val1=`echo $in1|awk -F"\-" '{print $1}'`
val2=`echo $in1|awk -F"\-" '{print $2}'`
for index in $(eval echo {$val1..$val2})
do
server="$host_start$index$host_end"
echo "Current server: $server "
done
fi
当我执行这个时,我得到:
./run.bash apache[9-11]
Current server: apache9
Current server: apache10
Current server: apache11
$ ./run.bash apache[f-k]
Current server: apachef
Current server: apacheg
Current server: apacheh
Current server: apachei
Current server: apachej
Current server: apachek
$ ./run.bash apache[f-k]abc
Current server: apachefabc
Current server: apachegabc
Current server: apachehabc
Current server: apacheiabc
Current server: apachejabc
Current server: apachekabc
感谢大家的更新
3 行完成以上所有操作,并处理我想要的所有类型,方法如下:
#!/bin/bash
val=$1;
value=`echo "$val"|sed 's:(:{:g; s:):}:g; s:|:,:g; s/^//;s/$//'`
value=`echo "$value"|sed 's:\[:{:g; s:\]:}:g; s:-:\.\.:g; s/^//;s/$//'`
(eval echo $value)
./test-brace.sh "(server|apache)[0-2][a-c]"
server0a server0b server0c server1a server1b server1c server2a server2b server2c apache0a apache0b apache0c apache1a apache1b apache1c apache2a apache2b apache2c
【问题讨论】:
-
预期输出是什么?
in1的awk命令对我来说失败了,未定义的函数's'。 -
顺便问一下,您是在尝试复制大括号扩展吗?
echo {server,web}{01..10}{a..z} -
1.同意您需要向我们展示更多您的用例,即。输入和所需的输出。 2.您是否尝试生成所有可能的字符串,或者仅在服务器/资源实际存在时匹配? (使用此信息编辑您的问题)。 3.“想检查是否有更简单的方法”。您可能可以捕获所有 shell 变量
host*, start, fin, etc并在 1 个 awk 脚本中打印输出。 4.也就是说,胆大妄为+1! 5.当你知道将其中的 80-90% 放入 1 个 awk 脚本是多么容易时,你就会真正学到一些东西。 6. 祝你好运! -
抱歉,尝试 #!/bin/bash 调用脚本,我将使用输出更新原始问题,但认为 chepner 的第二篇文章是我一直在寻找的。刚刚跑了回声线 - 这太棒了 Chepner :)
-
@chepner:将其添加为答案。
标签: regex bash shell brace-expansion