您的位置:首页 > 运维架构 > Shell

shell常见操作

2013-05-30 17:38 211 查看
想成为一名合格的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 不用加引号就可以直接运算出结果
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: