0

私は次の機能を持っています:

s() { c=$1; while((c--)) ; do printf 'x' ; done }; s 2

だからx2回印刷されます。

このコードを単純化することは可能ですか?

最初に、割り当て部分をスキップして、次のことを行いたいと思いc=$1;ます。

while((1--))

あなたはなにか考えはありますか ?

4

1 に答える 1

0

これを試して:

s() { for i; do printf 'x' ; done }; s 2 3

ここで、forループはデフォルトで関数に渡された引数を取り、それらをiに割り当てるので、もう必要ありc=$1ません。

わかりました、私はあなたの問題に直接答えていません。

パラメータを変更するには、次を使用する必要がありますset -- word。例:

> set -- 5
> echo $1
5
> set -- $(( $1-1 ))
> echo $1
4

あなたの機能は次のようになります:

s() { while (( $1 )); do echo 'x'; set -- $(( ${1}-1 )); done }

ただし、スクリプトのパフォーマンスと明瞭さが少し失われます。

>time s 100000 > /dev/null
real    0m1.235s
user    0m1.196s
sys     0m0.040s

と一緒にs() { c=$1; while (( c-- )); do echo 'x'; done }

>time s 100000 > /dev/null
real    0m0.520s
user    0m0.496s
sys     0m0.024s

私はこれを試しました:

s1() { for i in $(eval echo {1..${1}}); do printf 'x'; done }

しかし、主な問題は、evalステートメントの子プロセスの作成です。パフォーマンスは上記より少し速いですが、それでも読むのは少し難しいです:

>time s1 100000 > /dev/null
real    0m0.453s
user    0m0.412s
sys     0m0.040s

お役に立てれば。

于 2012-09-14T10:25:31.123 に答える