Shell 脚本是系统命令的堆积,用于简化操作步骤,提高效率,减少人为干预,减少系统故障。在学习 Shell 之前必须会熟练的手动运用系统命令,不会手动搭建或者执行某些程序,那么一定学不会 Shell
脚本的基本格式和执行方式
## 基本格式
[root@Shell ~]# vim test.sh
#!/bin/bash
echo "Hello world"
## 运行脚本
[root@Shell ~]# chmod +x test.sh
[root@Shell ~]# ./test.sh
Hello world
Shell常用字符
- 命令排序
- ; 没有逻辑关系,无论分号前面的命令执行是否成功都执行后者命令
- && 前面执行成功, 则执行后者
- || 前面执行不成功, 则执行后者
- shell 通配符
- 匹配任意多个字符
- ? 匹配任意一个字符
- [] 匹配括号中任意一个字符和一定范围的字符,比如a-z,0-9,A-Z,a-Z
- () 会在子 shell 中执行
- {} 按顺序逐个匹配,比如 touch file{1..9}
- 转义符
- echo输出颜色、printf 格式化输出文本
- echo -e " 33[30m 黑色字 33[0m"
- echo -e " 33[31m 红色字 33[0m"
- echo -e " 33[32m 绿色字 33[0m"
- echo -e " 33[33m 黄色字 33[0m"
- echo -e " 33[34m 蓝色字 33[0m"
- echo -e " 33[35m 紫色字 33[0m"
- echo -e " 33[36m 天蓝字 33[0m"
- echo -e " 33[37m 白色字 33[0m"
- shell 中的特殊指令
- trap "" INT QUIT TSTP 禁止 ctrl+c 退出脚本(慎用)
Shell脚本变量
简单的理解变量: 用一个固定的字符串去表示不固定的内容
[root@Shell ~]# a=1
[root@Shell ~]# b=2
[root@Shell ~]# echo $a
1
[root@Shell ~]# echo $b
2
变量常见类型
自定义变量
系统环境变量
位置参数变量
预先定义变量
- 自定义变量
- 定义变量:变量名=变量值 ,不允许数字命名, 不能使用横岗命名
- 引用变量:$变量名 或 ${变量名}
- 查看变量:echo $变量名 set显示所有变量,包括自定义变量和环境变量
- 取消变量:unset 变量名 作用范围:仅在当前 shell 中有效
- 系统环境变量
- 定义环境变量:export export 变量 ,将自定义变量转换成环境变量
- 引用环境变量:$变量名 或 ${变量名}
- 查看环境变量:echo $变量名 env |grep Name
- 取消环境变量:unset 变量名
- 变量作用范围:在当前shell和子shell有效
- 位置参数变量
- 脚本参数传参: $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
- 预先定义变量
- $0 脚本文件名
- $* 所有的参数
- $@ 所有的参数
- $# 参数的个数
- $$ 当前进程的 PID
- $! 上一个后台进程的 PID
- $? 上一个命令的返回值 0 表示成功
可以写个脚本测试一下
[root@Shell ~]# vim variable.sh
#!/bin/bash
echo " 第 3 个位置参数是$3"
echo " 第 2 个位置参数是$2"
echo " 第 1 个位置参数是$1"
echo " 所有参数是: $*"
echo " 所有参数是: $@"
echo " 参数的个数是: $#"
echo " 当前进程的 PID 是: $$"
echo '$4='$4
echo '$5='$5
echo '$6='$6
echo '$*='$*
echo '$@='$@
echo '$#='$#
echo '$$='$$
[root@Shell ~]# chmod +x variable.sh
[root@Shell ~]# ./variable.sh 1 2 3 4 5 6
变量赋值方式
变量名=变量值
number=192.168.1.1
name="Songguoyou"
var1=`date +%F`
var2=$(date +%F)
- 使用
read
函数从键盘读入变量值- read -p 提示语句
- read -n 最大字符数
- read -t 等待时间(秒)
- read -s 屏幕不显示输入内容
read 变量名
read -p "提示信息: " 变量名
read -t 5 -p "提示信息: " 变量名
read -n 2 变量名
[root@Shell ~]# vim ping.sh
#!/bin/bash
read -p "Input IP: " ip
ping -c2 $ip &>/dev/null
if [ $? -eq 0 ];then
echo "host $ip is ok"
else
echo "host $ip is fail"
fi
[root@Shell ~]# chmod +x ping.sh
[root@Shell ~]# ./ping.sh 192.168.1.1
注意事项: 定义或引用变量时注意事项:
"弱引用"
和'强引用'
[root@Shell ~]# namel=Songguoyou
[root@Shell ~]# echo "${name} is good"
Songguoyou is good
[root@Shell~]# echo '${name} is good'
${name} is good
``和 $() 一样,里面的 shell 命令会被先执行
[root@Shell ~]# touch `date +%F`_file1.txt
[root@Shell ~]# touch $(date +%F)_file2.txt
变量数值运算
## 整数运算 expr +(加) -(减) *(乘) /(除) %(余)
expr 1 + 2
expr $num1 + $num2
## 整数运算 $(()) +(加) -(减) *(乘) /(除) %(余)
echo $((5-3*2))
echo $(($num1+$num2))
## 整数运算 $[] +(加) -(减) *(乘) /(除) %(余)
echo $[5+2]
## 整数运算 let +(加) -(减) *(乘) /(除) %(余)
let sum=2+3;
echo $sum
## 小数运算 bc let +(加) -(减) *(乘) /(除) %(余)
echo "2*4" |bc
echo "print 5.0/2" |python
变量删除替换
变量删除
[root@Shell ~]# url=www.songguoyou.com.cn
## 获取变量值的长度
[root@Shell ~]# echo ${#url}
## 从前往后,切下去第一个点之前的
[root@Shell ~]# echo ${url#*.}
## 从前往后,切下去最后一个点之前的
[root@Shell ~]# echo ${url##*.}
## 从后往前,切下去第一个点之后的
[root@Shell ~]# echo ${url%.*}
## 从后往前,切下去最后一个点之后的
[root@Shell ~]# echo ${url%%.*}
切片
## 从第0个字符开始,保留之后的5个字符
[root@Shell ~]# echo ${url:0:5}
## 从第5个字符开始,保留之后的5个字符
[root@Shell ~]# echo ${url:5:5}
## 从第5个字符开始,保留之后的所有字符
[root@Shell ~]# echo ${url:5}
变量替换
## 把songguoyou替换成baidu
[root@Shell ~]# echo ${url/songguoyou/baidu}
## 第一个n替换成N
[root@Shell ~]# echo ${url/n/N}
## 所有n替换成N
[root@Shell ~]# echo ${url//n/N}
变量替代
变量没有被赋值:会使用“新的变量值“ 替代
变量有被赋值: 不会被替代
## 空值不会替换
[root@Shell ~]# echo ${url-www.baidu.com}
## 空值会被替换
[root@Shell ~]# echo ${url:-www.baidu.com}
变量自增
## 先赋值,再运算
[root@Shell ~]# let var=i++
## 先运算,再赋值
[root@Shell ~]# let var=++i