Linux解决遍历参数问题,获取脚本的第n个参数

468 阅读1分钟

可能刚学习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位参数的值了。