私は次の機能を持っています:
s() { c=$1; while((c--)) ; do printf 'x' ; done }; s 2
だからx
2回印刷されます。
このコードを単純化することは可能ですか?
最初に、割り当て部分をスキップして、次のことを行いたいと思いc=$1;
ます。
while((1--))
あなたはなにか考えはありますか ?
私は次の機能を持っています:
s() { c=$1; while((c--)) ; do printf 'x' ; done }; s 2
だからx
2回印刷されます。
このコードを単純化することは可能ですか?
最初に、割り当て部分をスキップして、次のことを行いたいと思いc=$1;
ます。
while((1--))
あなたはなにか考えはありますか ?
これを試して:
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
お役に立てれば。