Shell是系统的用户界面,提供了用户与内核进行交互操作的一种接口
它接收用户输入的命令并把它送入内核去执行。实际上Shell是一个命令解释器,它解释由用户输入的命令并且把它们送到内核。不仅如此,Shell有自己的编程语言用于对命令的编辑,它允许用户编写由shell命令组成的程序。Shell编程语言具有普通编程语言的很多特点,比如它也有循环结构和分支控制结构等,用这种编程语言编写的Shell程序与其他应用程序具有同样的效果。
Shell最主要的功用都是解译使用者在命令列提示符号下输入的指令
Shell 的另一个重要功用是提供个人化的使用者环境,这通常在 shell 的初始化档案中完成(.profile、.login、.cshrc、.tcshrc 等等)。这些档案包括了设定终端机键盘和定义窗口的特征;设定变量,定义搜寻路径、权限、提示符号和终端机类型;以及设定特殊应用程序所需要的变量,例如窗口、文字处理程序、及程序语言的链接库。Shell 也能当解译性的程序语言(interpreted programing language)。Shell 程序,通常叫做命令文件,它由列在档案内的命令所构成。此程序在编辑器中编辑(虽然也可以直接在命令列下写作程序,online scripting),由 UNIX 命令和基本的程序结构,例如变量的指定、测试条件、和循环所构成。
Shell的编写流程:用编辑器编写Shell脚本文件;赋予文件可执行权限;执行及调试
1、启动:
从菜单启动:应用程序——>附件——>文本编辑器
从命令行执行以下命令: gedit
2、窗口说明:
菜单栏:包含您在 gedit 中处理文件所需的所有命令。
工具栏:包含您可以从菜单栏访问的命令的子集。
显示区域:该区域包含您正在编辑的文件的文本。
输出窗口:显示 Shell 命令插件和比较文件插件返回的输出。
状态栏:显示关于当前 gedit 活动的信息和关于菜单项的上下文信息。
vi 编辑器是 Linux/UNIX 环境下经典的编辑器。Linux vi 命令非常强大,熟练地使用它可以高效的编辑代码,配置系统文件等,是程序员和运维人员必须掌握的技能。
vi编辑器的基本使用方法及语法:传送门
需要注意的是Sheel文件的后缀都是.sh,类似于C语言的.c文件
Linux/Unix 的文件调用权限分为三级 : 文件拥有者、群组、其他。利用 chmod 可以改变文件或目录的读、写、执行的允许权。
参数说明
[-R]为递归处理,将指定目录下所有文件及子目录一并处理
mode为权限设定字串,格式如下 :
[ugoa...][[+-=][rwxX]...][,...]
其中:
u 表示该文件的拥有者,g 表示与该文件的拥有者属于同一个群体(group)者,o 表示其他以外的人,a 表示这三者皆是。
+表示增加权限、- 表示取消权限、= 表示唯一设定权限。
r 表示可读取,w 表示可写入,x 表示可执行,X 表示只有当该文件是个子目录或者该文件已经被设定过为可执行。
其他参数说明:
chmod ugo+r file1.txt
或者
chmod a+r file1.txt
-将文件 file1.txt 与 file2.txt 设为该文件拥有者,与其所属同一个群体者可写入,但其他以外的人则不可写入 :
chmod ug+w,o-w file1.txt file2.txt
chmod -R a+r *
假设有一个脚本script.sh 使用BASH shell
1.使用./script.sh
2.使用bash script.sh 或者sh script.sh
3.使用. script.sh
注意!.是一个命令,后面要有空格(source命令也称为“点命令”,也就是一个点符号(.),是bash的内部命令)
以上三种执行方式的具体区别:传送门
Shell调试的具体方法: 传送门
在Shell程序的开头要加上#!/bin/bash
意思是指此脚本使用/bin/bash来解释执行就是用bin目录下的bash来进行解析
其中,#!是一个特殊的表示符,其后,跟着解释此脚本的shell路径。
当然,bash只是shell的一种,还有很多其它shell,如:sh,csh,ksh,tcsh…
1、echo:打印文字到屏幕
2、exec:执行另一个Shell脚本
3、read:读标准输入
4、expr:对整数型变量进行算术运算
5、test:用于测试变量是否相等、 是否为空、文件类型等
6、exit:退出
需要特别注意的是,在Shell中的比较字符跟我们经常接触的C语言,Java有些不一样的地方,如下所示
-eq 等于
-ne 不等于
-gt 大于
-lt 小于
-le 小于等于
-ge 大于等于
-z 空串
= 两个字符相等
!= 两个字符不等
-n 非空串
意思就是在Shell中用 -gt 表示大于关系,用 -lt 表示小于关系,而不能直接用>,<号表示
在Shell中用符号#进行注释
Shell变量分为用户自定义、预定义和环境变量三种。一般以一下方式定义变量:“变量名=变量值”
例如:
INPUT=5
需要注意的是 :
变量名一般大写,且等号两边不能空格,变量调用使用“$变量名”实现
1、用户自定义变量
这种变量只支持字符串类型,不支持其他字符、浮点等类型,常见有以下3个前缀:
(1)unset:删除变量
(2)readonly:标记只读变量
(3)export:指定全局变量
2、预定义变量
预定义变量用来获取命令行的输入,常用的有:
(1)$0 :脚本文件名
(2) 1 − 9 : 第 1 − 9 个 命 令 行 参 数 名 ( 3 ) 1-9 :第 1-9 个命令行参数名 (3) 1−9:第1−9个命令行参数名(3)# :命令行参数个数
(4) @ : 所 有 命 令 行 参 数 ( 5 ) @ :所有命令行参数 (5) @:所有命令行参数(5)* :所有命令行参数
(6) ? : 前 一 个 命 令 的 退 出 状 态 , 可 用 于 获 取 函 数 返 回 值 ( 7 ) ? :前一个命令的退出状态,可用于获取函数返回值 (7) ?:前一个命令的退出状态,可用于获取函数返回值(7)$ :执行的进程 ID
例如:实现编写shell脚本 ex2.sh,能将命令行参数相加并输出,如:
./ex2.sh 1 3 8输出结果为12
代码如下:
#!/bin/bash
sum=0
for i in $@
do
sum=$[$sum+$i]
done
echo "sum = $sum"
3、环境变量
环境变量默认存在,一般包含下面几个:
(1)HOME:用户主目录
(2)PATH:系统环境变量 PATH
(3)TERM:当前终端
(4)UID:当前用户 ID
(5)PWD:当前工作目录,绝对路径
Shell比较常见的运算包括以下4中,功能都是将m+1:
m=$[ m + 1 ]
m=expr $m + 1 `
用``字符包括起来 ,需要注意的是加号两边要有空格let m=m+1
m=$(( m + 1 ))
Shell编程中if语句与C语言类似,用于程序分支,也可构成分支嵌套形式,但是在Shell中的if语句的语法和C语言有所区别,在if 和 else if后要加上then,在if语句结尾必须要加上fi作为结束的标志
例如:
INPUT=10
if test $INPUT -eq 10
then
echo "hello"
else
echo "Shell"
fi
case语句相当于C语言中的switch,所以当然case语句也可以用if语句来实现,case语句格式较复杂,请注意使用细节
例如:
#!/bin/bash
read NAME #类似于scanf
case $NAME in
"Linux")
echo "Linux"
;;
"hello")
echo "hello"
;;
*) #跟switch中的default类似
echo "other"
;;
esac #case语句结束标志
Shell编程中for语句与C语言类似,用于程序循环,也可构成循环嵌套形
for循环语句格式
Shell中的for循环要在执行语句的前面加上do,在执行语句后加上done
另外在Shell中break,continue的用法和在C语言中的用法一致
和其他编程语言一样,Shell 也支持数组。数组(Array)是若干数据的集合,其中的每一份数据都称为元素(Element)。
Shell 并且没有限制数组的大小,理论上可以存放无限量的数据。和 C++、Java、C# 等类似,Shell 数组元素的下标也是从 0 开始计数。
获取数组中的元素要使用下标[ ],下标可以是一个整数,也可以是一个结果为整数的表达式;当然,下标必须大于等于 0。
遗憾的是,常用的 Bash Shell 只支持一维数组,不支持多维数组。
Shell数组的具体定义和使用方法:传送门
vi hello.sh
#!/bin/bash
echo "hello Shell!"
chmod a+x hello.sh
./hello.sh #注意./后面和文件名之间不能有空格