【shell】常用语法 -b file -c file -f file-d file -x file
一、test条件判断
1,test文件测试:
-b file 若文件存在且是一个块特殊文件,则为真
-c file 若文件存在且是一个字符特殊文件,则为真
-d file 若文件存在且是一个目录,则为真
-e file 若文件存在,则为真
-f file 若文件存在且为一个规则文件,则为真
-g file 若文件存在且设置了SGID位的值,则为真
-h file 若文件存在且为一个符号链接,则为真
-k file 若文件存在且设置了“sticky”位的值,则为真
-p file 若文件存在且为一已命名管道,则为真
-s file 若文件存在且其大小大于零,则为真
-u file 若文件存在且设置了SUID位的值,则为真
-r file 若文件存在且可读,则为真
-w file 若文件存在且可写,则为真
-x file 若文件存在且可执行,则为真
-o file 若文件存在且被有效用户ID所拥有,则为真
2,test字符串比较
-z string 若string长度为0,则为真
-n string 若string长度不为0,则为真
string1 = string2 若两个字符串相等,则为真
string1 != string2 若两个字符串不相等,则为真
3,test命令的数字比较操作符
int1 -eq int2 若int1等于int2,则为真
int1 –ne int2 若int1不等于int2,则为真
int1 –lt int2 若int1小于int2,则为真
int1 –le int2 若int1小于等于int2,则为真
int1 –gt int2 若int1大于int2,则为真
int1 –ge int2 若int1大于等于int2,则为真
4,test复合表达式
! expr 若expr为假则复合表达式为真。expr可以是任何有效的测试表达式
expr1 -a expr2 若expr1和expr2都为真,则为真
expr1 -o expr2 若expr1和expr2有一个为真,则为真
二、shell里的特殊变量
# sh /usr/local/bkeep/shell.sh 001 002
I'm $0 is:/usr/local/bkeep/shell.sh //正在被执行脚本的名字;`basename $0`
I'm $1 is:001 //$1接收到的参数
I'm $2 is:002 //$2接收到的参数
I'm $# is:2 //总共接收到的参数个数
I'm $* is:001 002 //把接收到的参数全部打印出来
I'm $@ is:001 002 //同上
I'm $? is:0 //上一个脚本的退出状态“0”代表正常;“1”非正常退出
I'm $$ is:24137 //当前执行脚本的进程ID
I'm $! is: //前一个后台进程的id
三:其他
1.返回值 #?
cd dir
echo "$?"
如果dir存在,则返回0,不存在则返回1. 其他函数的命令也是一样,比如diff,等等。
每个命令都会返回一个 exit 状态(有时候也叫return 状态).成功返回0,如果返回一个非0 值,通
常情况下都会被认为是一个错误码.一个编写良好的UNIX 命令,程序,和工具都会返回一个0 作为
退出码来表示成功,虽然偶尔也会有例外.
同样的,脚本中的函数和脚本本身都会返回退出状态.在脚本或者是脚本函数中执行的最后的命
令会决定退出状态.在脚本中,exit nnn 命令将会把nnn 退出码传递给shell
$?读取最后执行命令的退出码.函数返回后,$?给出函数最后执行的那条命令的退出码.这种给
函数返回值的方法是 Bash 的方法.对于脚本来说也一样.总之,一般情况下,0 为成功,非0 失败W
2 .
$ 变量替换操作符
只有在变量被声明,赋值,unset 或exported 或者是在变量代表一个signal 的时候,
变量才会是以本来的面目出现在脚本里.变量在被赋值的时候,可能需要使用"=",
read状态或者是在循环的头部.
在""中还是会发生变量替换,这被叫做部分引用,或叫弱引用.而在''中就不会发生变
量替换,这叫做全引用,也叫强引用.这两个符合在同一个按键上。具体见第5 章的讨论.
注意:$var 与${var}的区别,不加{},在某些上下文将引起错误,为了安全,使用2.
还有一个按键在左上角,即按键1的左边。此按键有下面的作用。即将ls -l的结果传给a
17 a=`ls -l` # 把ls -l 的结果给a
18 echo $a # 别忘了,这么引用的话,ls 的结果中的所有空白部分都没了(包括换行)
19 echo
20 echo "$a" # 这么引用就正常了,保留了空白
或者直接
echo "$(ls -l)" 也可以取出目录
3.
在read 命令状态中
30 echo -n "Enter \"a\" "
31 read a
32 echo "The value of \"a\" is now $a."
33
34 echo
35
这个方法可以接受键盘输入到a中。
4.
在一个双引号中直接使用变量名,一般都是没有问题的.它阻止了所有在引号中的特殊字符的
重新解释--包括变量名[2]--但是$,`和\除外.[3]保留$,作为特殊字符的意义,是为了能够在双
引号中也能够正常地引用变量("$var").这样在""中可以使用变量所表达的值(Example 4-1).
使用""来防止单词分割.[4]如果在参数列表中使用双引号,将使得双引号中的参数作为一个参
数.即使双引号中的字符串包含多个单词(也就是包含空白部分),也不会变为多个参数,如:
1 variable1="a variable containing five words"
2 COMMAND This is $variable1 # COMMAND 将以7 个参数来执行
3 # "This" "is" "a" "variable" "containing" "five" "words"
4
5 COMMAND "This is $variable1" # COMMAND 将以1 个参数来执行
5.赋值的方法
--------------------------------------------------------
a:C风格的赋值
7 (( a = 23 )) # 给一个变量赋值,从"="两边的空格就能看出这是c 风格的处理.
8 echo "a (initial value) = $a"
9
10 (( a++ )) # 变量'a'后加1,C 风格.
11 echo "a (after a++) = $a"
12
13 (( a-- )) # 变量'a'后减1,C 风格.
14 echo "a (after a--) = $a"
------------------------------------------------
37(( t = a<45?7:11 )) # C 风格的3 元操作.
38 echo "If a < 45, then t = 7, else t = 11."
39 echo "t = $t " # Yes!
---------------------------------------------------
18 LIMIT=10
19
20 for ((a=1; a <= LIMIT ; a++)) # Double parentheses, and "LIMIT" with no "$".
20 for ((a=1; a <= LIMIT ; a++)) # 双圆括号, 并且"LIMIT"变量前边没有 "$".
21 do
22 echo -n "$a "
23 done
--------------------------------------------
b:let
4 a=2334 # 整型
5 let "a += 1" #不加双引号也可以
6 echo "a = $a " # a = 2335
--------------------------------------------------------------------
c:取变量
5 a=2334
6 a=$(($a+1))
7 echo "$a" #a=2335
------------------------------------------