0

我有以下功能:

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

所以x被打印了两次。

是否可以简化此代码?

起初我想跳过分配部分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 回答