linux shell脚本语言基础知识一.shell简介Linux系统的shell作为操作系统的外壳,为用户提供使用操作系统的界面,更确切的说,shell是用户与Linux操作系统沟通的桥梁。
用户既可以输入命令执行,又可以利用Shell脚本编程,完成更加复杂的操作。
shell是一个命令解释器,它从输入设备读取命令,再将其转为计算机可以了解的指令,然后执行它。
在linux中,shell又不仅是简单的命令解释器,而且是一个全功能的编程环境。
Linux的Shell种类众多,常见的有:Bourne Shell(/usr/bin/sh或/bin/sh)、Bourne Again Shell(/bin/bash)、C Shell(/usr/bin/csh)、K Shell(/usr/bin/ksh)、Shell for Root(/sbin/sh),等等。
不同的Shell语言的语法有所不同,所以不能交换使用。
每种Shell都有其特色之处,基本上,掌握其中任何一种就足够了。
通常用Bash,也就是Bourne Again Shell进行编程。
二.shell使用1.建立和运行shell程序shell脚本程序:按照一定的语法结构把若干linux命令组织在一起,是这些命令按照我们的要求完成一定的功能。
它可以进行类似程序的编写,并且不需要编译就能执行。
(只需修改其权限)像编写高级语言的程序一样,编写shell程序需要一个文本编辑器,如VI和VIM,通常使用VIM文本编辑器,支持更便利的插入模式。
首先使用VIM编辑器编辑一个hello.sh文件:#!/bin/bash#hello world exampleecho "hello world"这样,一个最简单的shell程序就编写完了。
第一行:#!说明hello.sh这个文件的类型的,这有点类似于Windows系统下的用不同的文件后缀来表示不同的文件类型,但又不完全相同。
Linux系统根据#!及该字符串后面的信息确定该文件的类型。
在#!之后是一个路径名,这个路径名指定了一个解释脚本中命令的程序。
第二行:“#hello world example”就是shell程序的注释,(但后面紧接着“!”号的除外)第三行:echo(回显)语句的功能是把echo后面的字符串输出到标准输出中。
现在,建立和写好之后,那么该程序如何运行呢?由于该脚本没有执行的权限,只需要修改其执行的权限即可,执行:chmoda+x hello.sh。
然后输入命令:./hello.sh即可看到效果。
2.shell变量变量是一个存储值的实体,可以是一个名字,或者一个特殊的值。
shell可以创建,分配和删除变量。
(1)变量设置规则:a.变量与变量内容以等号(=)来连接b.等号两边不能直接接空格符c.变量名称只能是英文字母与数字或下划线,但是数字不能是开头符d.引用变量名用“$变量名”#!/bin/bash#hello world examplea="hello world"echo $a以上例子一样可以输出hello world。
e.若有空格符可以使用双引号或单引号将变量内容结合起来,但必须注意,双引号的特殊字符可以保有变量的特性,但是单引号内的特殊字符则仅为一般字符。
#name="$LOGNAME is hh" //root is hh#name='$LOGNAME is hh' //$LOGNAME is hhf.通常大写字符为系统预设变量,自行设定的变量可以使用小写字符(2)取消变量:用unset 变量名#!/bin/bash#hello world 例子a="hello world"unset aecho $a以上例子将不会打印出任何东西。
3.shell特殊变量$0 :执行的脚本的文件名$1 :脚本文件的第一个参数名$# :传递到脚本的参数个数$* :以一个单字符串显示所有向脚本传递的参数$$ :脚本运行的当前进程ID号$? :显示最后命令的退出状态,0表示没有错误,其它值表示有错误例子a.sh#!/bin/bashecho "the file is $0"echo "the parameter is $1 $2"echo "number of parameter is $#"echo "all parameter is $*"echo $?加权限后执行./a.sh hh mm gg则打印the file is ./a.shthe parameter is hh mmnumber of parameter is 3all parameter is hh mm gg4.常用shell内嵌命令(1)echo:显示变量内容(2)env:显示目前系统中主要的预设变量内容(3)set:显示目前系统中全部的变量内容(4)read:从键盘读入变量内容(5)declare:声明变量内容-a:定义为数组array-f:定义为函数function-i:定义为整数integer-r:定义为“只读”-x:定义为透过环境输出变量、例子:#!/bin/basha=1+1declare -i b=1+1echo $aecho $b执行后输出结果为1+125.条件测试在写shell脚本时,经常遇到的问题就是判断字符串是否相等,可能还要检查文件状态或进行数字测试,只有这些测试完成才能做下一步动作。
test命令就是用于测试字符串,文件状态和数字的.test命令两种格式:test condition或[ condition ]使用方括号时,要注意在条件两边加上空格三.shell脚本编程基础知识1.shell基本运算符(1)算术运算符+:对两个变量做加法。
-:对两个变量做减法。
\*:对两个变量做乘法。
/:对两个变量做除法。
**:对两个变量做幂运算。
%:取模运算,第一个变量除以第二个变量求余数。
+=:加等于,在自身基础上加第二个变量。
-=:减等于,在第一个变量的基础上减去第二个变量。
*=:乘等于,在第一个变量的基础上乘以第二个变量。
/=:除等于,在第一个变量的基础上除以第二个变量。
%=:取模赋值,第一个变量对第二个变量取模运算,再赋值给第一个变量在使用这些运算符时,需要注意到运算顺序的问题。
例如输入下面的命令,输出1+2的结果。
echo 1+2Shell并没有输出结果3,而是输出了1+2。
在shell中有三种方法可以更改运算顺序。
a、用expr改变运算顺序。
可以用echo `expr 1 + 2`来输出1+2的结果,用expr 表示后面的表达式为一个数学运算。
需要注意的是,`并不是一个单引号,而是“Tab”键上面的那个符号。
b、用let指示数学运算。
可以先将运算的结果赋值给变量b,运算命令是b=let1 + 2。
然后用echo $b来输出b的值。
如果没有let,则会输出1+2。
c、用$[]表示数学运算。
将一个数学运算写到$[]符号的中括号中,中括号中的内容将先进行数学运算(中括号中可以包含空格)。
例如命令echo $[1+2],将输出结果3。
(2)关系运算符-eq:数值相等-ne:数值不相等-ge:数1大于等于数2-lt:数1小于数2 -gt:数1大于数2 -le:数1小于等于数2输入test 1 -lt 2 && echo "yes"则打印yes(3)布尔运算-a:(and)两状况同时成立!test -r file -a -x file,则file同时具有r和x权限时,才为true。
-o:(or)两状况任何一个成立!test -r file -o -x file,则file具有r或x权限时,就为true。
!:相反状态,test !-r file,当file不具有r权限时,就为true。
(4)字符串运算符=:两个字符串相等!=:两个字符串不相等-z:空串-n:非空串输入test "a" = "a" && echo "yes"则打印yes(5)测试文件状态的条件表达式:-e:是否存在-d:是目录-f:是文件-L:符号连接-s文件非空-r:可读-w:可写-x:可执行2.shell条件语句(1)if...fi语句结构if [条件1];then执行程序fi例子:#!/bin/bashdeclare -i a=10declare -i b=20if [ $a == $b ];thenecho "a is equal to b"fiif [ $a != $b ];thenecho "a is not equal to b"fi输出结果为:a is not equal to b(2)if...else...fi语句结构if [条件1];then执行程序1else执行程序2fi例子:#!/bin/bashdeclare -i aecho "input 1 or 2"read aif [[ $a -eq 1 ]];thenecho "1"elseecho "2"fi打印为input 1 or 211(3)if...elif...else...fi语句结构if [条件1];then执行程序1elif[条件2];then执行程序2else执行程序3fi例子:#!/bin/bashdeclare -i a=10declare -i b=20if [ $a == $b ];thenecho "a is equal to b"elif [ $a -gt $b ];thenecho "a is greater than b"elseecho "a is less than b"fi输出结果为:a is less than b (4)case...esac语句结构case $变量名称in“第一个变量内容”)程序1;;“第二个变量内容”)程序2;;*)其它程序exit 1esac例子:#!/bin/bashecho "you like"echo "1 is apple"echo "2 is orange" echo "input your choice" read acase $a in1)echo "you like apple" ;;2)echo "you like orange" ;;*)echo "you like nothing" exit 1esac执行后结果为:you like1 is apple2 is orangeinput your choiceyou like apple3.shell循环类型(1)for循环循环操作项目清单。