在实际的应用中有这样的一个需求,要求在不同的平台上实现通用的功能,需要检测平台的名称,实际的测试中发现有的老期的平台只能使用sh,而不用使用bash,而正好我的这个平台在sh下不能使用数组的功能。
实验脚本如这样:
# 平台数组
platforms=(fetmx6ull-s imx6ull imx6ul ok335x 6Quad imx6q i.MX6 5718 6818 4418 A40i 1028 ls1043ardb ls1046ardb ls1012ardb imx8mq OK8MP okmx8mm 3399 ok3568 okg2l)
for i in ${platforms[@]}
do
检测平台名称
done
执行的时候就会报错误
解决方法
为了能够正常使用,经实验,可整理了几种方法,在这里列举出来,供用到的来参考。
使用eval
首先定义一个函数
# 首先定义一个函数
get_value() {
newname=${1}${2}
eval "echo $`echo $newname`"
}
# 实现
pref=array
indx=1
eval "$pref$indx=fetmx6ull-s"
val=`get_value $pref $indx`
indx=2
eval "$pref$indx=imx6ull"
val=`get_value $pref $indx`
indx=3
eval "$pref$indx=imx6ul"
val=`get_value $pref $indx`
这样就相当于定义了一个数组array ,变量分别是array1,array2,array3,看着好像有点麻烦,是吧,但是至少功能是实现了。
使用awk
我们变换了一个思路,数组是提前保存好的一个结构,使用的时候直接取出就可以了,我们现在这么做,用一个字符串保存数组中的所有内容,当使用的时候我们在逐一取出其中一个就ok了,只是在取出的阶段发生变化而已。
str_platform="fetmx6ull-s imx6ull imx6ul ok335x 6Quad imx6q i.MX6 5718 6818 4418 A40i 1028 ls1043ardb ls1046ardb ls1012ardb imx8mq OK8MP okmx8mm 3399 ok3568 okg2l":wq!
for j in `seq 1 20` #上面的字符串一共攨空格隔开
do
i=`echo $str_platforms | awk '{print $'$j'}'`
echo $i
done
执行如下图:
root@imx6ulevk:~# cat a.sh
str_platform="fetmx6ull-s imx6ull imx6ul ok335x 6Quad imx6q i.MX6 5718 6818 4418 A40i 1028 ls1043ardb ls1046ardb ls1012ardb imx8mq OK8MP okmx8mm 3399 ok3568 okg2l"
for j in `seq 1 20` #上面的字符串一共攨空格隔开
do
i=`echo $str_platform | awk '{print $'$j'}'`
echo $i
done
root@imx6ulevk:~# sh a.sh
fetmx6ull-s
imx6ull
imx6ul
ok335x
6Quad
imx6q
i.MX6
5718
6818
4418
A40i
1028
ls1043ardb
ls1046ardb
ls1012ardb
imx8mq
OK8MP
okmx8mm
3399
ok3568
使用文件做临时缓存
echo -e "fetmx6ull-s\nimx6ull\nimx6ul\nok3354418\nA40i\n1028\nls1043ardb\nls1046ard\n" >platforms.log
cat platforms.log |
while read line
do
echo $line
done
创作不易,点个赞在走呗、欢迎关注。
--好记性不如烂笔头。