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 脚本的执行方式
- 输出脚本的相对路径/绝对路径
- bash/sh +脚本
3 shell中的变量
3.1 概述
- Linux Shell中的变量分为“系统变量”和“用户自定义变量”,可以通过set命令查看系统变量。
- 系统变量:$HOME、$PWD、$SHELL、$USER等等
- 显示当前shell中所有变量:set
3.2 定义变量
3.2.1 基本语法
- 定义变量: 变量=值
- 撤销变量: unset 变量
- 声明静态变量:readonly 变量
- 全局变量:export 变量
3.2.2 变量定义规则
- 变量名称可以由字母、数字和下划线组成,但是不能以数字开头。
- 等号两侧不能有空格
- 变量名称一般习惯为大写
- 双引号和单引号有区别,双引号仅将空格脱意,单引号会将所有特殊字符脱意
3.3 命令的返回值复制给变量
- A=`ls -la`反引号,运行里面的命令,并把结果返回给变量A
- A=$(ls -la)等价于反引号
3.4 设置环境变量
基本语法:
- export 变量名 = 变量值(功能描述:设置环境变量的值)
- source 配置文件(功能描述:让修改后的配置信息立即生效)
- echo $变量名(功能描述:查询环境变量的值)
3.5 位置参数变量
基本语法:
- $n(功能描述:n为数字,$0代表命令本身,$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10})
- $*(功能描述:这个变量代表命令行中所有的参数,**$把所有的参数看成一个整体*)
- $@(功能描述:这个变量也代表命令行中所有的参数,不过**$@把每个参数区分对待**)
- $#(功能描述:这个变量代表命令行中所有参数的个数)
#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 预定义变量
基本语法:
- $$(功能描述:当前进程的进程号PID)
- $!(功能描述:后台运行的最后一个进程的进程号PID)
- $?(功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个值为非0,则证明上一个命令执行不正确)
#!/bin/bash echo "$$" ./helloworld.sh & echo "$!" echo "$?" #上一个命令执行是否正确
4 运算符
基本语法:
- "$((运算式))"或”$[运算式]
- expr m + n(注意expr运算符之间有空格)
- expr m - n(注意expr运算符之间有空格)
- /*,/,%,乘,除,取余
**案例:**计算(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循环
基本语法:
- for 变量 in 值1 值2 值3…… do 程序 done
- 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