我希望能够让用户输入:
./script.sh server[01-10]type
我已经得到了这个,并且可以与 [az] 或 [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