Shell脚本基础知识

Shell 脚本是系统命令的堆积,用于简化操作步骤,提高效率,减少人为干预,减少系统故障。在学习 Shell 之前必须会熟练的手动运用系统命令,不会手动搭建或者执行某些程序,那么一定学不会 Shell

toc
脚本的基本格式和执行方式

## 基本格式
[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

变量常见类型

自定义变量
系统环境变量
位置参数变量
预先定义变量

  1. 自定义变量
    1. 定义变量:变量名=变量值 ,不允许数字命名, 不能使用横岗命名
    2. 引用变量:$变量名 或 ${变量名}
    3. 查看变量:echo $变量名 set显示所有变量,包括自定义变量和环境变量
    4. 取消变量:unset 变量名 作用范围:仅在当前 shell 中有效
  2. 系统环境变量
    1. 定义环境变量:export export 变量 ,将自定义变量转换成环境变量
    2. 引用环境变量:$变量名 或 ${变量名}
    3. 查看环境变量:echo $变量名 env |grep Name
    4. 取消环境变量:unset 变量名
    5. 变量作用范围:在当前shell和子shell有效
  3. 位置参数变量
    1. 脚本参数传参: $1 $2 $3 $4 $5 $6 $7 $8 $9 ${10}
  4. 预先定义变量
    1. $0 脚本文件名
    2. $* 所有的参数
    3. $@ 所有的参数
    4. $# 参数的个数
    5. $$ 当前进程的 PID
    6. $! 上一个后台进程的 PID
    7. $? 上一个命令的返回值 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 
原文地址:https://www.cnblogs.com/songguoyou/p/11884211.html