Shell编程

1、Shell概述

Shell是一个命令行解释器,他为用户提供了一个向Linux内核发送请求一边运行程序的界面系统级程序,用户可以用Shell来启动、挂起、停止甚至是编写一些程序。

Shell还是一个功能相当强大的编程语言,易编写、易调试、灵活性强。Shell解释执行的脚本语言,在Shell中可以调用Linux系统命令。

2、shell 的脚本的执行方式

2.1 echo输出内容到控制台

echo -e [输出内容] -e 支持反斜线控制的字符转换

控制字符 作用
\ 输出\本身
\a 输出警告音
\b 退格键,也就是向左删除键
\c 取消输出行末的换行符。和“-n”选项一致
\e ESCAPE键
\f 换页符
\n 换行符
\r 回车键
\t 制表符,也就是Tab键
\v 垂直制表符
\0nnn 按照八进制ASCII码表输出字符。其中0为数字零,nnn是三位八进制数

2.2 脚本格式

文件脚本以**#!/bin/bash**开头,开启helloworld的世界。

#!/bin/bash echo "Hello World" 

2.3 脚本的执行方式

  1. 输出脚本的相对路径/绝对路径
  2. bash/sh +脚本

3 shell中的变量

3.1 概述

  • Linux Shell中的变量分为“系统变量”和“用户自定义变量”,可以通过set命令查看系统变量。
  • 系统变量:$HOME、$PWD、$SHELL、$USER等等
  • 显示当前shell中所有变量:set

3.2 定义变量

3.2.1 基本语法

  1. 定义变量: 变量=值
  2. 撤销变量: unset 变量
  3. 声明静态变量:readonly 变量
  4. 全局变量:export 变量

3.2.2 变量定义规则

  1. 变量名称可以由字母、数字和下划线组成,但是不能以数字开头
  2. 等号两侧不能有空格
  3. 变量名称一般习惯为大写
  4. 双引号和单引号有区别,双引号仅将空格脱意单引号会将所有特殊字符脱意

3.3 命令的返回值复制给变量

  1. A=`ls -la`反引号,运行里面的命令,并把结果返回给变量A
  2. A=$(ls -la)等价于反引号

3.4 设置环境变量

基本语法:

  1. export 变量名 = 变量值(功能描述:设置环境变量的值)
  2. source 配置文件(功能描述:让修改后的配置信息立即生效)
  3. echo $变量名(功能描述:查询环境变量的值)

3.5 位置参数变量

基本语法:

  1. $n(功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
  2. $*(功能描述:这个变量代表命令行中所有的参数,**$把所有的参数看成一个整体*)
  3. $@(功能描述:这个变量也代表命令行中所有的参数,不过**$@把每个参数区分对待**)
  4. $#(功能描述:这个变量代表命令行中所有参数的个数)
#position.sh #!/bin/bash echo "$1" echo "$2" echo "$3" echo "$*" echo "$@" echo "$#" [root@hadoop100 xiyouji]# ./position.sh 10 20 30 10
20
30
10 20 30
10 20 30
3

3.6 预定义变量

基本语法:

  1. $$(功能描述:当前进程的进程号PID)
  2. $!(功能描述:后台运行的最后一个进程的进程号PID)
  3. $?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个值为非0,则证明上一个命令执行不正确)
#!/bin/bash echo "$$" ./helloworld.sh & echo "$!" echo "$?" #上一个命令执行是否正确 

4 运算符

基本语法:

  1. "$((运算式))"或”$[运算式]
  2. expr m + n(注意expr运算符之间有空格)
  3. expr m - n(注意expr运算符之间有空格)
  4. /*,/,%,乘,除,取余

**案例:**计算(2+3) * 4的值

# 采用$[运算式] echo $[(2+3)*4] # 采用expr分布计算 A=`expr 2 + 3` expr $A \* 4 #expr一步完成计算 expr `expr 2 + 3` \* 4

5 条件判断

5.1 判断语句

基本语法:[ condition ] (注意condition前后有空格)

如:[root]返回true

[]返回false

5.2 常用判断条件

  • 整数之间比较
判断字符 意义
= 字符串比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
  • 文件权限 进行判断
判断字符 含义
-r 读取权限
-w 写入权限
-x 执行权限
  • 文件类型进行判断
判断字符 含义
-f 文件存在并且是一个常规的文件
-e 文件存在
-d 文件存在并且是一个目录

使用范例:

  • [ 23 -ge 22 ] 23是否大于等于2
  • [ -w student.txt ]文件是否具有写权限
  • [ -e /root/install.log ]目录中的文件是否存在

6 流程控制

6.1 if判断

基本语法:if [ 条件判断式 ] then 程序 fi

**示例:**判断输入的数是否是等于123,是否等于456

#!/bin/bash if [ $1 -eq "123" ]#if与[] 与判断条件都必须有空格 then echo “123” elif [ $1 -eq "345"] then echo "345" fi 

6.2 case语句

基本语法:case 变量名 in "值1") 程序 ;; …… * 默认程序 esac ;;

示例:

#!/bin/bash case $1 in "1") echo "1" ;; "2") echo "2" ;; *) echo "other" ;; esac [root@hadoop100 xiyouji]# ./case.sh 1 1 [root@hadoop100 xiyouji]# ./case.sh 2 2 [root@hadoop100 xiyouji]# ./case.sh other

6.3 for循环

基本语法:

  1. for 变量 in 值1 值2 值3…… do 程序 done
  2. for (( 初始值;循环控制条件;变量变化)) do 程序 done

示例:

  • 打印输入参数
  • 从1加到100
#!/bin/bash for i in "$*" do echo "The Number is $i" done for j in "$@" do echo "The Number is $j" done :q [root@hadoop100 xiyouji]# ./for.sh 123 456 789 465 The Number is 123 456 789 465
The Number is 123
The Number is 456
The Number is 789
The Number is 465
#!/bin/bash sum=0 for((i=1;i<=100;i++)) do sum=$[$sum+$i] done echo "The sum from 1 to 100 is $sum" 

6.4 while循环

基本语法:while (条件判断式) do 程序 done

**案例:**从1加到100

#!/bin/bash i=0
sum=0 while [ $i -le 100 ] do sum=$[$sum+$i] i=$[$i+1] done echo "The sum from 1 to 100 is $sum" 

7 read读取控制台输入

基本语法:read(选项)(参数)

选项:

  • -p 指定读取值时的提示符
  • -t 指定读取值时等待的时间(秒)

参数:指定读取值的变量名

案例:

[root@hadoop100 xiyouji]# read -t 5 -p "input your name:" NAME input your name:CourageHe [root@hadoop100 xiyouji]# echo $NAME CourageHe

8 函数

8.1 系统函数

  • basename(功能描述:删掉所有的前缀包括最后一个 **‘/’**字符,然后将字符串显示出来)
  • dirname(功能描述:文件绝对路径,,从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录))

8.2 自定义函数

基本语法:[function] funname[()]{Action; [return int;]}

注意:

  • 必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其他语言一样先编译。
  • 函数返回值,只能通过 $?系统变量活动,可以显示加:return返回,如果不加将以最后一条命令行运行结果,作为返回值。return后跟数值n(0-255)
#!/bin/bash function sum(){ s=$[ $1+$2] echo "The sum of two number is $s" } read -p "The first Number1: " n1 read -p "The second NUmber2:" n2 sum $n1 $n2