可能刚学习Linux的同学,在学习了一段时间后,想着自己写一个遍历代码玩一下,但写出来发现不对,在网上搜又没有什么好的方法,今天给大家分享下Linux遍历的写法。
错误写法
1、
#!/bin/bash
for ((i=1;i<=$#;i++))
do
echo "传递的第$i个参数是:$i"
done
结果:
这个写法是最不可能的,$i这里代表的是第几个参数,而不是具体的这个位子上参数的内容
2、
#!/bin/bash
for ((i=1;i<=$#;i++))
do
j=$i
echo "传递的第$i个参数是:$j"
done
结果:
这个写法利用了另一个变量j=$i,然后再获取$j,但其实跟上一个方法一样,只是多绕了一下
3、
#!/bin/bash
for ((i=1;i<=$#;i++))
do
echo "传递的第$i个参数是:$$i"
done
结果:
这里利用
$$i来做,思想是先获得i的变量值$i,然后获得这个值的参数位的参数值,但linux执行时将$$先执行,最终实现的是获取脚本运行的当前进程ID号
4、
#!/bin/bash
for ((i=1;i<=$#;i++))
do
echo "传递的第$i个参数是:\$$i"
done
结果:
这个方法是对上个方法的改进,既然linux会把$$默认到一起,那用\把$和$i分开,这样不就能得到想要的么,但linux把\$认为是一个转译后的字符串,不将这个当作参数符号了
5、
#!/bin/bash
for ((i=1;i<=$#;i++))
do
echo "传递的第$i个参数是:${$i}"
done
结果:
这个又是对上面方法的进一步改进,想着用{}把$和$i分开,但是显然这个也不成立,甚至直接报错。
正确写法
利用eval命令
#!/bin/bash
for ((i=1;i<=$#;i++))
do
eval j=\$$i
echo "传递的第$i个参数是:$j"
done
结果:
可以看出,利用这个写法可以很清楚的得到参数位和对应的参数值。
为什么? 下面来说说eval这个命令的特殊的地方。
首先,shell执行的时候会扫描代码,如果没有eval命令,那么
假设i=4
j=\$$i
会变成
j=$4
哎,这就有同学会问了,那这不就是我们想要的么,可惜,这里的$4是个字符串,不是参数,最后呈现的就跟我们的错误写法4一样了
而有了eval,他会在shell扫描时既会因为\符号把\$$i分成\和\i,$i因为是参数就获得参数值变成了4,然后eval还会在shell扫描时把\$的\给去掉
这样\就不会因为\\转译成字符串,也不会因为\$$连写被当成脚本进程ID,最终传给 j 的就是`4,这里的$4`不是字符串了,而是真正我们想要的参数变量,在运行后就是第4位参数的值了。