shell中用eval和一维数组模拟实现二维数组
2015-04-23 19:59
197 查看
众所周知, shell中只支持一维数组。你可以轻易的写下如下脚本:
输出结果:
first element: 0
all element: 0 1 2 3
arr len: 4
但有的时候, 二维数组对我们非常有用。 比如你可以实现一个3*3的乘法表格, 你可能会这么去做:
#!/bin/sh
arr0=(1,2,3)
arr1=(2,4,6)
arr2=(3,6,9)
i=1
j=2
#you want arr[i][j]
echo ${arr$i[$j]}输出结果:
./one.sh: line 10: ${arr$i[$j]}: bad substitution
原因是shell知会进行一次扫描和变量替换,所以不能引用变量作为变量名的一部分。 这个时候你会想到“eval”,它的作用是先扫描改行并完成所有的变量替换, 然后执行替换后的命令。 例如:
#!/bin/sh
i=1
a1=1234
eval echo \$a$i输出结果
1234
注意:第一个$前要用\, 向eval表明这是一个普通的$字符, 不需要理解为变量。 否则会eval会吧$a当成一个变量。
了解了eval的功力后, 我们就可以写出一个边长的二维数组了:
#!/bin/sh
row_nun=5
column_num=8
for i in `seq 0 $row_num`
do
for j in `seq 0 $column_num`
do
let value=$i*$j
eval arr$i[$j]=$value
done
eval echo \${arr$i[*]}
done
将会输出
0 0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7 8
0 2 4 6 8 10 12 14 16
0 3 6 9 12 15 18 21 24
0 4 8 12 16 20 24 28 32
0 5 10 15 20 25 30 35 40
#!/bin/sh #first way arr=(0 1 2 3) #second way for i in `seq 0 3` do arr[$i]=$i done #get one element echo "first element: ${arr[0]}" #get all element echo "all element: ${arr[*]}" #get arr len echo "arr len: ${#arr[*]}"
输出结果:
first element: 0
all element: 0 1 2 3
arr len: 4
但有的时候, 二维数组对我们非常有用。 比如你可以实现一个3*3的乘法表格, 你可能会这么去做:
#!/bin/sh
arr0=(1,2,3)
arr1=(2,4,6)
arr2=(3,6,9)
i=1
j=2
#you want arr[i][j]
echo ${arr$i[$j]}输出结果:
./one.sh: line 10: ${arr$i[$j]}: bad substitution
原因是shell知会进行一次扫描和变量替换,所以不能引用变量作为变量名的一部分。 这个时候你会想到“eval”,它的作用是先扫描改行并完成所有的变量替换, 然后执行替换后的命令。 例如:
#!/bin/sh
i=1
a1=1234
eval echo \$a$i输出结果
1234
注意:第一个$前要用\, 向eval表明这是一个普通的$字符, 不需要理解为变量。 否则会eval会吧$a当成一个变量。
了解了eval的功力后, 我们就可以写出一个边长的二维数组了:
#!/bin/sh
row_nun=5
column_num=8
for i in `seq 0 $row_num`
do
for j in `seq 0 $column_num`
do
let value=$i*$j
eval arr$i[$j]=$value
done
eval echo \${arr$i[*]}
done
将会输出
0 0 0 0 0 0 0 0 0
0 1 2 3 4 5 6 7 8
0 2 4 6 8 10 12 14 16
0 3 6 9 12 15 18 21 24
0 4 8 12 16 20 24 28 32
0 5 10 15 20 25 30 35 40
相关文章推荐
- Android查询:模拟键盘鼠标事件(adb shell 实现)
- java中将二维数组用一维数组实现的实例
- Linux中模拟shell实现ls命令(不加参数)
- 0-1背包和完全背包 的完整讲解版 包含 一维数组实现 和二维数组实现题目
- Android查询:模拟键盘鼠标事件(adb shell 实现)
- Android查询:模拟键盘鼠标事件(adb shell 实现)
- Linux用tc实现模拟网络延时的shell脚本
- shell中用while循环实现连加操作
- JavaScript实现一维数组转化为二维数组
- Android自动化测试初探(五): 再述模拟键盘鼠标事件(adb shell 实现)
- linux下C语言实现myshell模拟shell终端
- 模拟shell实现su命令(切换用户)
- Android自动化测试初探(五): 再述模拟键盘鼠标事件(adb shell 实现)
- 杨辉三角(打印出三角形)的一维数组和二维数组实现
- Android自动化测试初探(五): 再述模拟键盘鼠标事件(adb shell 实现)
- shell脚本实现简单的模拟用户操作,未加检查点。
- Android自动化测试初探(五): 再述模拟键盘鼠标事件(adb shell 实现)
- 【操作系统】进程程序替换之模拟实现一个简易的Shell
- shell脚本实现堆栈(模拟合服)
- 杨辉三角二维数组与一维数组实现(C语言)