下面我参考网上写的较好的文章,加上自己的一点理解修改。仅供看家参考。
Shell是一种具备特殊功能的程序,它是结语使用者和UNIX/Linux操作系统核心程序(kernel)之间的一个接口。是为了屏蔽内核的复杂性,也为了保护内核以免用户误操作造成损害,在内核周围建立一个外壳(shell),用户想shell提出请求,shell解释并将请求传给内核。
shell标准有 Bourne shell(sh),Korn shell(ksh),C shell(csh),Bourne Again Shell(bash)。
可以通过在终端输入:echo $SHELL 来查看当前shell。
shell程序设计语言支持绝大多数在高级语言中能见到的程序元素,如函数,变量,数组和程序控制结构。任何在提示符中能键入的命令,都能放到一个可执行的shell程序中。
本质上,shell脚本是命令行命令简单的组合到一个文件里面,shell基本上是一个命令解释器,类似于DOS下的command.com。接收用户命令,然后调用相应的应用程序。
通过编写一个shell来介绍shell的特点
shell文件的后缀名为.sh,如编写一个名为HelloShell的shell,其名称就是HelloShell.sh,一般我们使用vi或者vim来编写shell。
#!/bin/sh ——shell文件第一行
shell脚本是按行解释的,脚本的第一行总是已 #!/bin/sh开头,其中的sh表示使用的shell标准,目前新的版本中sh是指向bash也就是说在新版系统中,sh跟bash的脚本类型是一样。当然我们也可以替换成自己使用的shell类型。但你要确保在/bin/目录下有这个类型的执行文件。
#HelloShell.sh
#To show the enter name
在shell中已#号开都的行为注释行,一般第二行显示shell文件名称,第三行简单解释下这个shell的作用,比如我们所写的shell是为了将用户输入的名称显示出来。
echo -n "Enter Your Name:" ——系统执行到这一行后会在终端显示“Enter Your Name:”,然后停下来等待用户输入,用户可以输入一行数据,-n参数的意思是不输出末尾的换行符,也就是用户在这行的末尾输入数据,对应的参数是-e,换行输入数据。echo的其它参数可以通过 man echo来查看
read NAME ——这行命令是读取保存用户输入的数据,并通过变量NAME来引用数据
echo "Hello $NAME" ——这行的效果就是在终端显示你输入的数据,通过$NAME来获取之前保存到NAME引用下的数据。
编写完成后保存退出。之后可以通过给文件加执行权限直接运行脚本,也可以通过“sh 脚本名称”形式来运行脚本。权限添加如下:
chmod u+x HelloShell.sh
shell脚本常见变量:
shell中的变量一般用大写字母表示。使用echo命令获取单个变量值。
设置只读变量:如果设置变量时,不想改变其值,在变量前加上readonly可以将其设置为只读。***给变量赋值的时候=左右不能有空格***
name=value
readonly name
删除变量:unset name
数组变量:
给元素赋值:list【index】=value
给整个数组赋值变量:list=(value1 value2 value3 value4... valuen),元素之间用空格分离。
为部分元素赋值:list=([0]=value1 [3]=value3... [n]=valuen)
访问单个值:${list[index]}
访问整个数组:${list[*]}
${list[@]},可以处理包含空格的数组元素
删除数组元素与删除变量:
unset list【index】 ,也可以用list【index】=后面赋值为空,变量赋值为空和删除是有区别的,区别只是在使用${variable+string}和${variable?string}形式才会出现。
unset list删除整个数组,list=空只会清除第一个元素值
常用的shell变量:
PWD,UID,SHLVL,REPLY,RANDOM,SECONDS,IFS,PATH,HOME
位置变量:在shell中$0输出的是shell脚本的名称,$1~$9表示的是脚本参数
特定变量:$# —— 表示脚本的参数个数
$* —— 传递到脚本的参数,与位置变量不同,参数选项可超过9个,使用echo $*,将输出所有参数
$$ —— 脚本运行时,当前进程的ID号,常用作临时变量的后缀
$! —— 后台运行的(&)最后一个进程的ID号,这个没用过。
$@ —— 与$#相同,使用时加引号,并在引号中返回参数个数,这个也没用过
$- —— 上一个命令的最后一个参数
$? —— 最后命令退出状态,0表示没有错误,其它值表示错误类型
逻辑操作符:
-a —— 逻辑与(and) 如:判断文件file1可读并且文件file2可写是否成立,【 -r file1.c -a -w file2.c 】
-o —— 逻辑或(or)
! —— 逻辑否
字符串测试:
= ——两个字符串相等
!= —— 两个字符串不相等
-z —— 空串 如,判断HelloShello.sh文件是否为空:【 -z HelloShello.sh 】
-n —— 非空串
数值测试:
-eq= —— 数值相等(equal to)如判断10是否等于12:【 “10” -eq “12” 】
-ne —— 数值不相等(not equal to)
-gt —— 第一个数大于第二个数(greater than)
-lt —— 第一个数小于第二个数(less than)
-le —— 第一个数等于第二个数
-ge —— 第一个数大于等于第二个数
控制结构:选择结构:
if语句:if then else提供条件测试,格式如:
if 【 判断条件 】
then
命令语句1
elif 【 判断条件 】
then
命令语句2
else
命令语句3
fi
case语句:匹配判断,格式如:
case 值 in —— 后面必须跟in
模式1) —— 后面必须有右括号
命令语句1
;; —— 执行语句结束标志
模式2)
命令语句1
;;
esac
循环结构:
for:循环处理列表内的信息,格式如:
for 变量 in 列表
do
命令语句
done
until:判断条件在循环末尾,至少执行一次,格式如下:
until 条件
do
命令语句
done
while:判断条件在循环头部,格式如下:
while 条件
do
命令语句2
done
函数相关的以后再说!