我有以下功能:
s() { c=$1; while((c--)) ; do printf 'x' ; done }; s 2
所以x
被打印了两次。
是否可以简化此代码?
起初我想跳过分配部分c=$1;
并做:
while((1--))
你有什么想法 ?
我有以下功能:
s() { c=$1; while((c--)) ; do printf 'x' ; done }; s 2
所以x
被打印了两次。
是否可以简化此代码?
起初我想跳过分配部分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
希望这可以帮助。