日期:2014-05-16  浏览次数:21221 次

关于shell整型变量
大家好,我看到一道shell程序:

Perl code

#!/bin/sh

foo=1

while [ "$foo" -le 20 ]
do
  echo "Here we go again"
  foo=$(($foo + 1)) #问题1.请问这句话改成“foo=$($foo + 1)”为什么不行?最里面的括号起到什么作用?
done

exit 0



问题2.shell整型变量还能如何实现自加呢?
请讨论这两个问题,谢谢!

------解决方案--------------------
1,我是这么记忆的,()是数值运算,$()是获取一条命令的输出,所以$((a + b))就是得到a+b的值了。

2,数值计算可以用foo=$(expr 1 + 2) 或者 let foo=1+2 , 可以使用for循环让其自增, 比较灵活的for循环形式如下:
C/C++ code
#!/bin/bash

for ((i = 0; i <= 10; ++ i))
do
        echo "a"
done

------解决方案--------------------
里面的()是新建一个子进程的意思
------解决方案--------------------
探讨

请问2楼的朋友,括号表示新建一个子进程,这类问题如果要在网上搜索,是用什么关键字?谢谢大家!

------解决方案--------------------
我搜了一个,你看下,很不错;
()

命令组.在括号中的命令列表, 将会作为一个子shell来运行.
在括号中的变量,由于是在子shell中,所以对于脚本剩下的部分是不可用的. 父进程, 也就是脚本本身, 将不能够读取在子进程中创建的变量, 也就是在子shell中创建的变量.
(cmd1;cmd2;cmd3)

初始化数组.
Array=(element1 element2 element3)

$(...)

相当于`...`命令,返回括号中命令执行的结果

let命令


(( ))
  
(( ... ))结构可以用来计算并测试算术表达式的结果. 退出状态将会与[ ... ]结构完全相反!还可应用到c风格的for,while循环语句,(( )) 中,所有的变量(加不加$无所谓)都是数值。

$((...))结构的表达式是C风格的表达式,其返回的结果是表达式值,其中变量引用可不用‘$’(当然也可以)

for((...;...;...))
do
cmd
done

while ((...))
do
cmd
done

比较操作符

<

小于

(("$a" < "$b"))
<=

小于等于

(("$a" <= "$b"))
>

大于

(("$a" > "$b"))
>=

大于等于

(("$a" >= "$b"))


(( 0 ))
echo "Exit status of \"(( 0 ))\" is $?." # 1
 
(( 1 ))
echo "Exit status of \"(( 1 ))\" is $?." # 0

(( 5 > 4 )) # 真
echo "Exit status of \"(( 5 > 4 ))\" is $?." # 0

(( 5 > 9 )) # 假
echo "Exit status of \"(( 5 > 9 ))\" is $?." # 1

(( 5 - 5 )) # 0
echo "Exit status of \"(( 5 - 5 ))\" is $?." # 1

(( 5 / 4 )) # 除法也可以.
echo "Exit status of \"(( 5 / 4 ))\" is $?." # 0

(( 1 / 2 )) # 除法的计算结果 < 1.
echo "Exit status of \"(( 1 / 2 ))\" is $?." # 截取之后的结果为 0.
# 1

(( 1 / 0 )) 2>/dev/null # 除数为0, 非法计算.
#
echo "Exit status of \"(( 1 / 0 ))\" is $?." # 1


for ((a=1; a <= LIMIT ; a++)) # 双圆括号, 并且"LIMIT"变量前面没有"$".
do
echo -n "$a "
done

while (( a <= LIMIT )) # 双圆括号, 变量前边没有"$".
do
echo -n "$a "
((a += 1)) # let "a+=1"
done

a=2
b=$(($a*4)) #a=2 b=8
c=$((a*3)) #a=2 c=6


[ ]

条件测试表达式放在[ ]中. 值得注意的是[是shell内建test命令的一部分, 并不是/usr/bin/test中的外部命令的一个链接.

文件测试操作符(如果下面的条件成立将会返回真)

-e

文件存在(推荐用)
-a

文件存在(不推荐用)

-f

表示这个文件是一个一般文件(并不是目录或者设备文件)
-s

文件大小不为零
-d