有类型变量:
可以使用内置命令declare设置变量属性。-表示打开选项,+表示关闭选项。
-a 将变量看成数组
-f 只使用函数名
-F 显示未定义的函数名
-i 将变量看作整数
-r 使变量只读,其值不能被后续赋值语句改变
-x 标记变量未通过环境导出,和export内置命令一样,允许列出变量被导出到当前shell环境
(好多选项不太懂呢,书上也没多说)
对于选项-i,看下面的例子:
val1=12 val2=5
result1=val1*val2
echo $result1
declare -i val3=12 val4=5
declare -i result2
result2=val3*val4
echo $result2
比较就可以看出区别了,实际上,不需要将val3和val4声明为整型,任何给result2赋值的东西将被解释成算术的而被取值。
注意:函数内使用declare声明的变量对于函数是局部的,就像使用local声明一样
整数变量和运算:
上篇文章出现的$(($OPTIND - 1))显示了shell进行整数运算的另一种方式。shell将$(())包围的单词解释为算术表达式。算术表达式内的变量前面不需要加美元标记,加上也可以。
算术操作符和关系操作符:
注意:等于也是两个等号==。
shell还支持N进制数,N从2到26.B#N表示“B进制数N”
算术条件:
可以用[]进行测试,如果为真就返回0,为假就返回1.
例如:
[ 3 -gt 2 ] 产生退出状态0
[ \(3 -gt 2\) || \(4 -le 1\) ] 必须对圆括号转义
算术测试还可以使用(()),但这个真值的返回为1,假返回0.刚好和[]相反。
算术变量和赋值:
我们可以通过declare定义整数变量,也可以对算术表达式求值并使用let将之赋值给变量:
let intvar=expression
表达式里面最好使用单引号:
let x='1+4'
'17 / 3'
'17 ^ 3'
下面编写脚本ndu,打印每个目录参数(及子目录)的磁盘空间使用信息,同时要给出字节数以及适当的千字节数或兆字节数。
#!/bin/bash
for dir in ${*:-.}; do
if [ -e $dir ]; then
result=$(du -s $dir | cut -f 1)
let total=$result*1024
echo -n "Total for $dir = $total bytes"
if [ $total -ge 1048576 ]; then
echo " ($((total/1048576)) Mb)"
elif [ $total -ge 1024 ]; then
echo " ($((total/1024)) Kb)"
fi
fi
done
1、如果不向du指定目录,就默认当前目录。
2、du的-s选项只输出最后一行。
2、cut的-f选项表示抽取那个域
数组:
特殊一点的数组赋值方式,假设names是一个数组
names=([2]=alice [0]=hatter [1]=duchess)
将顺序对应好的话,还可以
names=(hatter duchess alice)
names=(hatter [5]=duchess alice)
要创建一个空数组,可以使用declare的-a选项
例如:
declare -ar names
创建一个名为names的只读数组
可以使用${array[i]}来引用数组的元素,如果不给出下标,默认为0.
还可以使用特殊下标*和@。使用*将引用扩展到由IFS变量的第一个字符分隔的数组中的所有取值组成的一个单词中,而@将数组取值扩展成一组单独的单词,就像位置参数一样。这里用for循环。
for i in "${names[@]}"; do
echo $i
done
还有一个对数组有用的操作符是#。要找出一个数组中任意元素的长度,可以使用${#array[i]}.类似的,也可以找出数组中有多少取值${#array[@]}
可以使用unset内置命令销毁任意元素或者整个数组。uneset names[100],unset names, unset names[*]
分别是销毁一个元素,后面两个是销毁整个数组。
下面介绍的是使用素数组匹配系统上帐号名称和用户ID的简单例子。接受用户ID作为参数,打印帐号名以及在当前系统上的帐号数目。
$!/bin/bash
for i in $(cut -f 1,3 -d: /etc/passwd); do
array[${i#*:}]=${i%:*}
done
echo "User ID $1 is ${array[$1]}"
echo "There are currently ${#array[@]} user accounts on the system."
使用cut创建文件/etc/passwd第一域和第三域的列表,域1为帐户名,域3为该用户的ID。-d选项指定域的分隔符。
阅读(980) | 评论(0) | 转发(0) |