整理自个人笔记和网络

1.shell中位置参数

$0 这个程序的执行名字
 
$n 这个程序的第n个参数值,n=1..9
 $* 这个程序的所有参数,此选项参数可超过9个。
 $# 这个程序的参数个数
 $$ 这个程序的PID(脚本运行的当前进程ID号)
 $! 执行上一个背景指令的PID(后台运行的最后一个进程的进程ID号)
 $? 执行上一个指令的返回值 (显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误)
 $- 显示shell使用的当前选项,与set命令功能相同
 
$@ 跟$*类似,但是可以当作数组用

2.shell条件判断命令

–b 当file存在并且是块文件时返回真
 -c 当file存在并且是字符文件时返回真
 -d 当pathname存在并且是一个目录时返回真
 -e 当pathname指定的文件或目录存在时返回真
 -f 当file存在并且是正规文件时返回真
 -g 当由pathname指定的文件或目录存在并且设置了SGID位时返回为真
 -h 当file存在并且是符号链接文件时返回真,该选项在一些老系统上无效
 -k 当由pathname指定的文件或目录存在并且设置了“粘滞”位时返回真
 -p 当file存在并且是命令管道时返回为真
 -r 当由pathname指定的文件或目录存在并且可读时返回为真
 -s 当file存在文件大小大于0时返回真
 -u 当由pathname指定的文件或目录存在并且设置了SUID位时返回真
 -w 当由pathname指定的文件或目录存在并且可执行时返回真。一个目录为了它的内容被访问必然是可执行的。
 -o 当由pathname指定的文件或目录存在并且被子当前进程的有效用户ID所指定的用户拥有时返回真。
 UNIX Shell 里面比较字符写法:


-eq   等于
-ne      不等于
-gt      大于
-lt      小于
-le      小于等于
-ge   大于等于
-z      空串
=     两个字符相等
!=      两个字符不等
-n     
 总结:

 文档比较运算符  
 -e filename   假如 filename存在,则为真  [ -e /var/log/syslog ] 
 -d filename   假如 filename为目录,则为真  [ -d /tmp/mydir ] 
 -f filename   假如 filename为常规文档,则为真  [ -f /usr/bin/grep ] 
 -L filename   假如 filename为符号链接,则为真  [ -L /usr/bin/grep ] 
 -r filename   假如 filename可读,则为真  [ -r /var/log/syslog ] 
 -w filename   假如 filename可写,则为真  [ -w /var/mytmp.txt ] 
 -x filename   假如 filename可执行,则为真  [ -L /usr/bin/grep ] 
 filename1-nt filename2   假如 filename1比 filename2新,则为真  [ /tmp/install/etc/services -nt /etc/services ] 
 filename1-ot filename2   假如 filename1比 filename2旧,则为真  [ /boot/bzImage -ot arch/i386/boot/bzImage ]  字符串比较运算符 (请注意引号的使用,这是防止空格扰乱代码的好方法)  
 -z string   假如 string长度为零,则为真  [ -z "$myvar" ] 
 -n string   假如 string长度非零,则为真  [ -n "$myvar" ] 
 string1= string2   假如 string1和 string2相同,则为真  [ "$myvar" = "one two three" ] 
 string1!= string2   假如 string1和 string2不同,则为真  [ "$myvar" != "one two three" ]  算术比较运算符  
 num1-eq num2   等于 [ 3 -eq $mynum ] 
 num1-ne num2   不等于 [ 3 -ne $mynum ] 
 num1-lt num2   小于 [ 3 -lt $mynum ] 
 num1-le num2   小于或等于 [ 3 -le $mynum ] 
 num1-gt num2   大于 [ 3 -gt $mynum ] 
 num1-ge num2   大于或等于 [ 3 -ge $mynum ]
3.shell数组
数组(Array)是一个由若干同类型变量组成的集合,数组均由连续的存储单元组成,最低地址对应于数组的第一个元素,最高地址对应于最后一个元素。
Shell不直接支持如堆栈、队列、链表等数据结构,但可以很容易实现线性数据结构。对于树形、图等复杂的数据结构,shell理论上可以实现,但难度较大。
Shell只支持一维数组,array[x]表示array数组的第x+1个元素,支持的最大数值标号是599 147 937 791。
shell取得数组值(引用数组元素)格式是:${array[x]}。

Shell中允许数组空缺元素,即可以不连续地给数组赋值。还可以用圆括号将一组值赋给数组。
city=(Nanjing Beijing Melbourne NewYork)    #圆括号内以空格为分隔符,依次赋给数组元素。
echo "Extracting Substring"  #抽取字串  
 echo ${city[*]:0}            #抽取整个数组  Nanjing Atlanta Massachusetts Marseilles  
 echo ${city[*]:1}            #抽取从第1个元素到结束的数组  Atlanta Massachusetts Marseilles  
 echo ${city[*]:3}            #抽取从第3个元素到结束的数组  Marseilles  
 echo ${city[*]:0:2}          #抽取从第0个元素开始的两个元素  Nanjing Atlanta  
 echo  
 echo "Removing Substring"    #删除字串  
 echo ${city[*]#M*a}          #删除匹配M*a的最短字串  Nanjing Atlanta ssachusetts rseilles  
 echo ${city[*]##M*a}         #删除匹配M*a的最长字串  Nanjing Atlanta chusetts rseilles  
 echo  
 echo "Replcing Substring"    #替换子串功能  
 echo ${city[*]/M*s/Year}     #替换第1次与M*a匹配的子串  Nanjing Atlanta Year Year  
 echo ${city[*]//Mas/Year}    #替换所有与Mas匹配的子串   Nanjing Atlanta Yearsachusetts YeareillesYear  
4.Linux Shell 中的反引号,单引号,双引号
反引号位 (`) 位于键盘的Tab键的上方、1键的左方。注意与单引号(')位于Enter键的左方的区别。
   在Linux中起着命令替换的作用。命令替换是指shell能够将一个命令的标准输出插在一个命令行中任何位置。
   如下,shell会执行反引号中的date命令,把结果插入到echo命令显示的内容中。
   [root@localhost sh]# echo The date is `date`
   The date is 2011年 03月 14日 星期一 21:15:43 CST
   
   单引号、双引号用于用户把带有空格的字符串赋值给变量事的分界符。
   [root@localhost sh]# str="Today is Monday"
   [root@localhost sh]# echo $str
   Today is Monday
   如果没有单引号或双引号,shell会把空格后的字符串解释为命令。
   [root@localhost sh]# str=Today is Monday
   bash: is: command not found
   单引号和双引号的区别。单引号告诉shell忽略所有特殊字符,而双引号忽略大多数,但不包括$、\、`。
   [root@localhost sh]# testvalue=100
   [root@localhost sh]# echo 'The testvalue is $testvalue'
   The testvalue is $testvalue
   [root@localhost sh]# echo "The testvalue is $testvalue"
   The testvalue is 100