Shell 是一个命令行解释器,它为用户提供了一个向 Linux 内核发送请求以便运行程序的界面系统级程序,用户可以用 Shell 来启动、挂起、停止甚至是编写一些程序。
1.shell脚本格式要求
1. 脚本以#!/bin/bash 开头 2. 脚本需要有可执行权限
2 Shell的变量
1. Shell 中的变量分为系统变量和用户自定义变量。 2. 系统变量:$HOME、$PWD、$SHELL、$USER 等等,比如: echo $HOME 等等.. 3. 显示当前 shell 中所有变量:set
2.1 shell 变量的定义
1. 定义变量:变量名=值 2.撤销变量:unset 变量 3. 声明静态变量:readonly 变量,注意:不能 unset
定义变量的规则
1.变量名称可以由字母、数字和下划线组成,但是不能以数字开头。5A=200(×) 2. 等号两侧不能有空格 3. 变量名称一般习惯为大写, 这是一个规范
将命令的返回值赋给变量
1. A=`date`反引号,运行里面的命令,并把结果返回给变量 A 2. A=$(date) 等价于反引号
3 设置环境变量
1. export 变量名=变量值 (将 shell 变量输出为环境变量/全局变量) 2. source 配置文件(让修改后的配置信息立即生效) 3. echo $变量名(查询环境变量的值)
shell 脚本的多行注释
:<<! xxxxxx xxxxxx !
4 位置参数变量
当我们执行一个 shell 脚本时,如果希望获取到命令行的参数信息,就可以使用到位置参数变量. 比如 : ./add.sh 100 200 , 这个就是一个执行 shell 的命令行,可以在 add脚本中获取到参数信息
$n (n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}) $* (代表命令行中所有的参数,$*把所有的参数看成一个整体) $@ (代表命令行中所有的参数,不过$@把每个参数区分对待) $# (代表命令行中所有参数的个数)
5 预定义变量
就是 shell 设计者事先已经定义好的变量,可以直接在 shell 脚本中使用
1. $$ (当前进程的进程号(PID)) 2. $! (后台运行的最后一个进程的进程号(PID)) 3. $?(最后一次执行的命令的返回状态。如果这个变量的值为 0,证明上一个命令正确执行;
如果这个变量的值为非 0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
在一个 shell 脚本中简单使用一下预定义变量
#!/bin/bash echo "当前执行的进程 id=$$" #以后台的方式运行一个脚本,并获取他的进程号 /home/brian/show.sh & echo "最后一个后台方式运行的进程 id=$!" echo "执行的结果是=$?"
6 运算符
1. “$((运算式))” 或 “$[运算式] ” 或者 expr m + n 2. 注意 expr 运算符间要有空格, 如果希望将exp 的结果赋给某个变量,使用 `` 3. expr m - n 4. expr \*, /, % 乘,除,取余
应用实例
#!/bin/bash
#案例 1:计算(2+3)X4 的值 #使用第一种方式 RES1=$(((2+3)*4)) echo "res1=$RES1" #使用第二种方式, 推荐使用 RES2=$[(2+3)*4] echo "res2=$RES2" #使用第三种方式 expr TEMP=`expr 2 + 3` RES4=`expr $TEMP \* 4` echo "temp=$TEMP" echo "res4=$RES4" #案例 2:请求出命令行的两个参数[整数]的和 6 7 SUM=$[$1+$2] echo "sum=$SUM"
7 条件判断
[ condition ](注意 condition 前后要有空格) #非空返回 true,可使用$?验证(0 为 true,>1 为 false)
[ condition ] && echo “OK” || echo “ERROR” 条件满足,执行后面的语句
常用判断条件
1. = 字符串比较 2. 整数的比较 -lt 小于 -le 小于等于 -eq 等于 -gt 大于 -ge 大于等于 -ne 不等于 3. 按文件权限进行判断 -r 有读的权限 -w 有写的权限 -x 有执行的权限 4. 按文件类型进行判断 -f 文件存在并且是一个常规的文件 -e 文件存在 -d 文件存在并是一个目录
8 流程控制
8.1 if 判断
if [ 条件判断式 ] then 代码 fi
多分支判断
if [ 条件判断式 ] then 代码 elif [条件判断式] then 代码 fi
注意:[ 条件判断式 ] 括号和条件判断式之间必须有空格
8.2 case语句
case $变量名 in "值 1") 如果变量的值等于值 1,则执行程序 1 ;; "值 2") 如果变量的值等于值 2,则执行程序 2 ;; …省略其他分支… *) 如果变量的值都不是以上的值,则执行此程序 ;; esac
8.3 for循环
for 变量 in 值 1 值 2 值 3… do 程序/代码 done
基本语法2
for (( 初始值;循环控制条件;变量变化 )) do 程序/代码 done
8.4 while循环
while [ 条件判断式 ] do 程序 /代码 done
注意:while 和 [有空格,条件判断式和 [也有空格
9 read读取控制台输入
read(选项)(参数) -p:指定读取值时的提示符; -t:指定读取值时等待的时间(秒),如果没有在指定的时间内输入,就不再等待
应用实例
#!/bin/bash #案例 1:读取控制台输入一个 N1 值 read -p "请输入一个数 N1=" N1 echo "你输入的 N1=$N1" #案例 2:读取控制台输入一个 N2 值,在5秒内输入。 read -t 5 -p "请输入一个数 N2=" N2 echo "你输入的 N2=$N2"
10 函数
shell 编程和其它编程语言一样,有系统函数,也可以自定义函数。
10.1 系统函数
系统函数中,我们这里就介绍两个。
basename :返回完整路径最后 / 的部分,常用于获取文件名
basename [pathname] [suffix] basename [string] [suffix]
suffix 为后缀,如果 suffix 被指定了,basename 会将 pathname 或 string 中的 suffix 去掉。
dirname 返回完整路径最后 / 的前面的部分,常用于返回路径部分
dirname 文件绝对路径
10.2 自定义函数
[ function ] funname[()] { Action; [return int;] }
调用直接写函数名:funname [值]
应用实例
#!/bin/bash #案例:计算输入两个参数的和(动态的获取), getSum #定义函数 getSum function getSum() { SUM=$[$n1+$n2] echo "和是=$SUM" } #输入两个值 read -p "请输入一个数 n1=" n1 read -p "请输入一个数 n2=" n2 #调用自定义函数 getSum $n1 $n2