Chinaunix首页 | 论坛 | 博客
  • 博客访问: 318132
  • 博文数量: 82
  • 博客积分: 1530
  • 博客等级: 上尉
  • 技术积分: 771
  • 用 户 组: 普通用户
  • 注册时间: 2010-04-16 03:44
文章分类

全部博文(82)

文章存档

2011年(6)

2010年(76)

我的朋友

分类: LINUX

2010-05-06 02:36:18

有类型变量:
可以使用内置命令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选项指定域的分隔符。
阅读(944) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~