想成为一名合格的linux运维人员,shell编程必不可少。

    下面是我摘抄的一些shell规范 供自己以后学习工作使用:

 

find   /home -name lost* 2>err_log表示将标准错误输出,输出到err_log里面;
find   /home -name lost*  >all_log  表示将标准输出输出到all_log里面;其结果只有标准输出被输入到all_log中

,要想让标准错误输出与标准输出一道放入到all_log内,要用以下命令:
find  /home  -name  lost* >all_log 2>&1
还有一种简单的写法find  /home  -name  lost* >& all_log
如果出错信息并不重要,不需要保存到文件中去,可以用这个命令:
find  /home  -name  lost* 2>/dev/null
bash编程规则:
1、变量赋值时,'='左右两边都不能有空格;
2、BASH中的语句结尾不需要分号(";");
3、除了在变量赋值和在FOR循环BASH中的变量必须在变量前加"$"符号;更细致的文档甚至提到以单引号括起来的变量

将不被BASH解释为变量,如‘$STR',而被看成是纯纯的字符串。而且更为标准的变量引用方式是${STR}这样的,$STR自

不过是对${STR}的一种简化。在复杂情况下最好用带{}的表示方式。

BASH中的变量既然不需要定义,也就没有类型一说,一个变量即可以被定义为一个字符串,也可以被定义为整数。如果

对该变量进行整数运算,他就被解释为整数;如果对他进行字符串操作,他就被看作为一个字符串。

请看下面的例子:
关于整数变量的计算,有如下几种:
”+ - * %“,整数运算一般通过let和expr这两个指令来实现,如对变量x加1可以写作:let "x = $x + 1 "或者

x='expr $x + 1'
在比较操作符上,整数变量和字符串变量各不相同,如下:

备注               整数操作           字符串操作
相同               -eq                   =
不同               -nq                  !=
大于               -gt                   >
小于               -lt                   <
大于或等于         -ge 
小于或等于         -le 
为空               -z
不为空             -n 

例子如下:
比较字符串a和b 是否相等就写作:   if[ $a = $b ]
判断字符串a是否为空就写作:      if[-z $a]

BASH中的变量除了用于对整数和字符串进行操作以外,另一个作用就是作为文件变量。
BASH是linux操作系统的Shell,因此系统的文件必然是BASH需要操作的重要对象,如if[-x  /root]
可以用于判断/root目录是否可以被当前用户进入。
列出BASH中用于判断文件属性的操作符,如下:

   运算符                     含义 (满足下面要求时返回TRUE)

  -e   file                   文件file 已经存在

  -f   file                    文件file是普通文件

  -s   file                    文件file大小不为零

  -d   file                    文件file是一个目录

  -r   file                    文件file对当前用户可以读取

  -w   file                    文件file对当前用户可以写入

  -x   file                    文件file对当前用户可以执行

  -g   file                    文件file的GID标志被设置

  -u   file                    文件file的UID标志被设置

  -O   file                    文件file是属于当前用户的

  -G   file                    文件file的组ID和当前用户相同

  file1  -nt  file2            文件file1比file2更新

  file1  -ot  file2            文件file1比file2更老

 注意上面的file及file1、file2都是指某个文件或目录的路径;

关于局部变量:

在 BASH 程序中如果一个变量被使用了,那么直到该程序的结尾,该变量都一直有效。为了使得某个变量存在于一个局

部程序块中,就引入了局部变量的概念。BASH 中,在变量首次被赋初值时加上 local 关键字就可以声明一个局部变量

,如下面这个例子:
#!/bin/bash
HELLO=Hello  --全局变量
function hello{  

local HELLO=World ---局部变量 
echo $HELLO  
}
echo $HELLO ---显示全局变量 

hello         ---调用hello函数,显示局部变量 
echo $HELLO ---测试得到全局变量并没有被改变
该程序执行结果如下:
Hello
World
Hello
这个执行结果表明全局变量 $HELLO 的值在执行函数 hello 时并没有被改变。也就是说局部变量 $HELLO 的影响只存

在于函数那个程序块中。

 BASH中的变量与 C ++语言中变量的区别    
这里我们为原来不熟悉 BASH 编程,但是非常熟悉 C 语言的程序员总结一下在 BASH 环境中使用变量需要注意的问题

。  
1,BASH 中的变量在引用时都需要在变量前加上 "$" 符号( 第一次赋值及在For循环的头部不用加 "$"符号 ); 
2,BASH 中没有浮点运算,因此也就没有浮点类型的变量可用;  3,BASH 中的×××变量的比较符号与 C 语言中完全

不同,而且×××变量的算术运算也需要经过 let 或 expr 语句来处理;


bash中的基本流程控制语法:
if语句用于判断和分支,其语法规则和C语言的if非常相似。
fi 表示if语句结束,如果命令执行失败,则会返回一个非0的出口状态,则执行紧随fi之后的命令。

if  [expression]
then 
statments
fi
或者
if  [expression]
then 
statments
else
statments
fi
或者
if  [expression]
then
statments
else if [expression]
then
statments
else
statments
fi
或者
if [expression]
then
statments
elif [expression]
then
statments
else
statments
fi

值得说明的是如果你将if和then简洁的写在一行里面,就必须在then前面加上分号,
如:if[expression];then ...
例子:

#!/bin/bash   
if [ $1 -gt 90 ]
then
echo "Good, $1"  
elif [ $1 -gt 70 ]  
then   
echo "OK, $1"  
else   
echo "Bad, $1"  fi   exit 0   上面例子中的 $1 是指命令行的第一个参数,这个会在后面的“BASH 中的特殊保留

字”中讲解。 

for循环:
for $var [in word-list]
do 
statments
done
其中$var是循环控制变量,[in word-list]是$var需要遍历的一个集合,do/done对包含了循环体,相当于C++中的一对

大括号。另外如果do和for被写在同一行,必须在do前面加上“;”。


[root@localhost ~]# cat test1.sh #!/bin/bash
for day in Sun Mon Tue Wed Thu Fri Sat
do   
echo $day  
done    
[root@localhost ~]# ./test1.sh  
Sun 
Mon
Tue
Wed
Thu
Fri
Sat

注意如果列表被包含在一对双引号中,则被认为是一个元素


[root@localhost ~]# cat test1.sh #!/bin/bash  
for day in "Sun Mon Tue Wed Thu Fri Sat"  
do  
echo $day  
done    
exit 0  
[root@localhost ~]# ./test1.sh  
Sun Mon Tue Wed Thu Fri Sat

注意上面的例子中,在for所在那行的变量day是没有加"$"符号的,而在循环体内,echo
所在行变量$day是必须加上$符号的。

另外如果携程for day 而没有后面的in部分,则day将遍历命令行的所有输入参数。如下面这个程序:
#!/bin/bash    
for param  
do   
echo $param  
done   
exit 0   
上面这个程序将列出所有命令行参数。for 循环结构的循环体被包含在 do/done 对中,这也是后面的 while、until 

循环所具有的特点。

while [condition]
do 
statements
done

until 循环的基本结构:
until [ condition is TRUE]
do
statments
done


case
BASH中的case结构域C语言中的switch语句的功能比较类似,可以用于多行分支控制。
其基本结构是:
case  "$var" in
condition1 )
statments1;;
condition2 )
statments2;;
...
*)
default statments;;
esac --不匹配,或者执行完某一种情况,都要执行它之后的语句

下面这个程序是运用case结构进行分支执行的例子:


[root@localhost ~]# cat case.sh #!/bin/bash    
echo "Hit a key, then hit return."  
read Keypress    
case "$Keypress" in   [
[a-z] ) 
echo "Lowercase letter";;  
[A-Z] ) 
echo "Uppercase letter";;
[0-9] ) 
echo "Digit";;   
* ) 
echo "Punctuation, whitespace, or other";;  
esac    
exit 0  
[root@localhost ~]# ./case.sh
 Hit a key, then hit return.
 r  
Lowercase letter  
[root@localhost ~]# ./case.sh
 Hit a key, then hit return.
 T  
Lowercase letter  
[root@localhost ~]# ./case.sh 
Hit a key, then hit return. 
2
Digit

break/continue 
BASH语句可以让程序流程从当前循环体重完全跳出,而continue语句可以跳过档次循环的剩余部分并直接进入下一次循

环。
函数的使用:

函数的定义
BASH是一个相对简单的脚本语言,不过为了方便结构化设计,BASH中也提供了函数定义的功能。bash中的函数定义很简

单,只要像下面这样就行了;
function  my_funcname {
code  block
}
或者 
my_funcname(){
code block
}
第二种写法更接近于C语言中的写法。BASH中要求函数的定义必须在函数使用之前,这是和C语言用头文件说明函数方法

的不同。

函数的参数与返回值

更进一步的问题是如何给函数传递参数和获得返回值。
参数:
BASH中函数参数的定义并不需要在函数定义出就制定,而只需要在函数被调用时用BASH的保留变量$1 $2...来引用就可

以了;
返回值:
BASH的返回值可以用return语句来指定返回一个特定的整数,如果没有return语句显示的返回一个返回值,则返回值就

是该函数最后一条语句执行的结果(一般为0,如果执行失败,则返回错误码)。函数的返回值在调用该函数的程序体

中通过$?保留字来活得。下面我们就来看一个用函数来计算整数平方的例子:
#!/bin/bash
xscl(){ #函数并不需要制定参数
#let或者expr 来执行整数运算
let "res = $1 * $1
return  $res
}
xscl $1  #调用函数
result=$?  #$?此保留字保存的是它之前最后一条语句的执行结果,函数的返回值被保存在了$?字中,这里赋给了变量

result
echo $result  #显示出xscl $1的执行结果

exit 0 #如果前面执行成功的话,以0值为返回值推出,即为该脚本的出口状态。


bash中特殊保留的符号:
$IFS    这个变量中保存了用于分割输入参数的分割字符,默认空格
$HOME   这个变量中存储了当前用户的根目录路径
$PATH   这个变量中存储了当前Shell的默认路径字符串
$ps1    表示第一个系统提示符
$ps2    表示第二个系统提示符
$PWD    表示当前工作路径
$EDITOR 表示系统的默认编辑器名称
$BASH   表示当前Shell的路径字符串
$0,$1,$2... 表示系统传给脚本程序或脚本程序传给函数的第0个、第一个、第二个等参数。
$#  表示脚本程序的命令参数个数或者函数的参数个数
$$  表示该脚本程序的进程号,常用于生成文件名唯一的临时文件
$?  表示脚本程序或函数的返回状态值,正常为0,否则为非0的错误号。
$*  表示所有的脚本参数或函数参数
$@  和$*含义相似,但是比$*更安全
$!  表示最近一个在后头运行的进程的进程号

随机数
随机数是经常要用到的,BASH中也提供了这个功能:
#!/bin/bash
a=$RANDOM
echo $a
exit 0
这个程序可以再每次执行的时候随机打印出一个大小在1到65535之间的整数。

运算符
算术运算符
+ - * / %表示加减乘除和取余运算
+= -= *= /=同C++

bash -x bash-script 命令,可以查看一个出错的BASH脚本到底错在什么地方,可以帮助程序员找出脚本中的错误。

 let 与expr 的计算技巧

let  运算时要加一个引号把运算部分引起来

expr  不用加引号就可以直接运算出结果