2

ユーザーが入力できるようにしたい:

./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
4

2 に答える 2

3

スクリプトは必要ありません。ブレースの拡張が必要です。

echo {server,web}{01..10}{a..z}

for s in {server,web}{01..10}{a..z}; do
    echo Current Server: $s
done
于 2012-09-20T12:23:46.990 に答える
2

他の回答は別として、フォークを使用してawk数百万の CPU サイクルを浪費していると思います。シェル変数の一部のサブストリングを削除したい場合は、これらの (POSIX) 修飾子を使用します。

$ foo=bar-baz-frob
$ echo ${foo%-*}    # Remove shortest match from the end
bar-baz
$ echo ${foo%%-*}   # Remove longest match from the end
bar
$ echo ${foo#*-}    # Remove shortest match at the beginning
baz-frob
$ echo ${foo##*-}   # Remove longest match at the beginning
frob
$

に加えて*、範囲も?受け入れますが、多重度は受け入れません。 [0-9a-f]{}

シェルを交換したい場合はzsh、ブレース展開でこれを行うことができます:

zsh$ setopt BRACE_CCL
zsh$ echo {server,web}{01..10}{a-h}
server01a server01b server01c server01d server01e server01f server01g server01h 
server02a server02b server02c server02d server02e server02f server02g server02h 
server03a server03b server03c server03d server03e server03f server03g server03h 
server04a server04b server04c server04d server04e server04f server04g server04h 
server05a server05b server05c server05d server05e server05f server05g server05h 
server06a server06b server06c server06d server06e server06f server06g server06h 
server07a server07b server07c server07d server07e server07f server07g server07h 
server08a server08b server08c server08d server08e server08f server08g server08h 
server09a server09b server09c server09d server09e server09f server09g server09h 
server10a server10b server10c server10d server10e server10f server10g server10h 
web01a web01b web01c web01d web01e web01f web01g web01h web02a web02b web02c web02d 
web02e web02f web02g web02h web03a web03b web03c web03d web03e web03f web03g web03h 
web04a web04b web04c web04d web04e web04f web04g web04h web05a web05b web05c web05d 
web05e web05f web05g web05h web06a web06b web06c web06d web06e web06f web06g web06h 
web07a web07b web07c web07d web07e web07f web07g web07h web08a web08b web08c web08d 
web08e web08f web08g web08h web09a web09b web09c web09d web09e web09f web09g web09h
web10a web10b web10c web10d web10e web10f web10g web10h

私はちょうどbashでそれを試しました。少し違います:

echo {server,web}{01..10}{a..h}
于 2012-09-20T09:12:37.393 に答える