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