直接修改传递的参数

时间:2012-09-14 10:02:17

标签: bash obfuscation

我有以下功能:

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

所以x被打印两次。

是否可以简化此代码?

首先,我想跳过分配部分c=$1;并执行:

while((1--))

你有什么想法吗?

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

希望这有帮助。