Shell脚本基础

一、Shell 基础认知

1. 什么是 Shell?

Shell 是用户与操作系统内核之间的交互桥梁,它接收用户输入的命令并传递给内核执行。简单来说,Shell 就是一个命令解释器。

2. Shell 的种类

Linux 系统中常见的 Shell 类型包括:

powershell

[root@MissHou ~]# cat /etc/shells 
/bin/sh			# bash的快捷方式
/bin/bash		# 大多数Linux默认Shell,功能全面
/sbin/nologin	# 非交互Shell,无法登录
/bin/dash		# 轻量型Shell,功能较少
/bin/tcsh		# csh的增强版
/bin/csh		# C语言风格Shell

二、Shell 脚本基础

1. 什么是 Shell 脚本?

Shell 脚本是将一系列命令按顺序保存到文本文件中,可被解释执行的脚本文件。它无需编译,是解释型的。

组成要素:若干命令 + 脚本基本格式 + 脚本特定语法 + 业务逻辑

2. 脚本应用场景

  • 自动化分析处理
  • 自动化备份
  • 自动化批量部署安装
  • 重复化、复杂化工作的自动化执行

3. 脚本基本格式

shell

#!/bin/bash
# Name: 脚本名称
# Desc: 脚本描述
# Path: 存放路径
# Usage: 使用方法
# Update: 更新时间

# 脚本具体命令
commands
...
  • 第一行#!/bin/bash为魔法字节,指定脚本解释器
  • 注释以#开头
  • 命令按执行顺序排列

4. 脚本执行方法

(1)标准执行方法(推荐)

shell

# 赋予执行权限
chmod +x 脚本名.sh
# 执行脚本
./脚本名.sh
# 或使用绝对路径
/完整路径/脚本名.sh
(2)非标准执行方法

shell

# 使用bash解释器执行
bash 脚本名.sh
# 使用sh解释器执行
sh 脚本名.sh
# 调试模式执行(查看执行过程)
bash -x 脚本名.sh
# 检查语法错误
bash -n 脚本名.sh
# 读取并执行脚本(不创建子进程)
source 脚本名.sh
. 脚本名.sh

三、Bash 基本特性

1. 命令和文件自动补全

使用Tab键可实现命令、文件名、目录名的自动补全,按两次Tab可显示所有候选。

2. 常用快捷键

快捷键功能描述
^c终止前台运行的程序
^z将前台程序挂起到后台
^d退出当前会话(等价于 exit)
^l清屏
^a/Home光标移到命令行开头
^e/End光标移到命令行结尾
^u删除光标前所有字符
^k删除光标后所有字符
^r搜索历史命令

3. 常用通配符

通配符功能描述
*匹配 0 或多个任意字符
?匹配任意单个字符
[list]匹配 list 中的任意单个字符
[!list]匹配除 list 外的任意单个字符
{string1,string2,...}匹配多个字符串中的一个

示例

powershell

# 创建多个文件
touch file{1..3}.txt
# 匹配所有txt文件
ls *.txt
# 匹配file后跟一个字符的文件
ls file?.txt
# 匹配file后跟数字1-3的文件
ls file[1-3].txt

4. Bash 中的引号

引号类型特点
双引号""将内容视为整体,允许通过$引用变量
单引号''将内容视为整体,禁止引用变量,特殊符号视为普通字符
反撇号 ``$()功能相同,优先执行内部命令,不支持嵌套

示例

powershell

[root@server ~]# echo "$(hostname)"
server
[root@server ~]# echo '$(hostname)'
$(hostname)
[root@server ~]# echo `date +%F`
2018-11-22

四、变量定义与使用

1. 变量分类

(1)本地变量

当前用户自定义,仅在当前进程中有效:

powershell

A=hello
(2)环境变量

当前进程有效,且能被子进程调用:

powershell

# 查看环境变量
env
# 查看所有变量(含本地变量)
set
# 将本地变量转为环境变量
export A=hello
# 永久生效(需写入配置文件)
vim /etc/profile 或 ~/.bashrc
export A=hello
(3)系统内置变量

Shell 固定定义的变量,具有特定功能:

变量功能描述
$?上一条命令的退出状态(0 为成功,非 0 为失败)
$$当前进程的进程号
$#脚本后面的参数个数
$*所有参数(作为整体)
$@所有参数(作为独立个体)
$0当前执行的程序名
$1~$9位置参数变量
${10}~${n}第 10 个及以后的位置参数

2. 变量定义规则

  1. 变量名 = 变量值(等号两边无空格)
  2. 获取变量值:$变量名 或 ${变量名}
  3. 取消变量:unset 变量名
  4. 变量名区分大小写
  5. 变量名由字母、数字、下划线组成,不能以数字开头
  6. 命令执行结果可保存到变量:

    powershell

    kernel=`uname -r`
    name=$(uname -n)
    

3. 数组

(1)普通数组(整数索引)

powershell

# 定义数组
array=(var1 var2 var3)
array1=(`cat /etc/passwd`)  # 从文件读取

# 访问数组元素
echo ${array[0]}          # 第一个元素
echo ${array[*]}          # 所有元素
echo ${#array[*]}         # 元素个数
echo ${!array[@]}         # 所有索引
echo ${array[@]:1:2}      # 从索引1开始取2个元素
(2)关联数组(字符串索引)

powershell

# 声明关联数组
declare -A asso_array

# 赋值
asso_array[linux]=one
asso_array[java]=two

# 访问
echo ${asso_array[linux]}
echo ${asso_array[*]}

五、算术运算

Shell 默认仅支持整数运算,常用方式:

  1. $(( ))

    powershell

    echo $((1+2))
    echo $((5-3))
    echo $((2*3))
    echo $((10/2))
    
  2. $[ ]

    powershell

    echo $[1+2]
    echo $[5-3]
    
  3. expr 命令(注意空格和转义)

    powershell

    expr 1 + 2
    expr 5 - 3
    expr 2 \* 3  # *需要转义
    
  4. let 命令

    powershell

    let a=1+2
    let b=5-3
    let a+=1  # 等价于a=a+1
    

自增运算

  • i++:先使用后自增
  • ++i:先自增后使用

六、条件判断

1. 语法格式

  • test 条件表达式
  • [ 条件表达式 ](注意前后空格)
  • [[ 条件表达式 ]](支持正则匹配=~

2. 常用判断参数

(1)文件判断
参数功能
-e文件或目录是否存在
-f是否为普通文件
-d是否为目录
-s文件是否非空
-r当前用户是否可读
-w当前用户是否可写
-x当前用户是否可执行
(2)整数比较
参数功能
-eq等于
-ne不等于
-gt大于
-lt小于
-ge大于等于
-le小于等于
(3)字符串判断
参数功能
-z字符串是否为空
-n字符串是否非空
=字符串是否相等
!=字符串是否不等
(4)多重条件判断
逻辑符功能
-a 或 &&逻辑与(两个条件都成立)
-o 或 ``逻辑或(任一条件成立)

3. 示例

powershell

# 判断文件是否存在
[ -f /etc/passwd ] && echo "文件存在" || echo "文件不存在"

# 判断是否为root用户
[ $(id -u) -eq 0 ] && echo "是管理员" || echo "非管理员"

# 判断字符串是否相等
name="shell"
[ "$name" = "shell" ] && echo "相等" || echo "不等"

七、流程控制语句

1. if 语句

(1)基本格式

powershell

# 单分支
if [ 条件 ]; then
    命令1
fi

# 双分支
if [ 条件 ]; then
    命令1
else
    命令2
fi

# 多分支
if [ 条件1 ]; then
    命令1
elif [ 条件2 ]; then
    命令2
else
    命令3
fi
(2)示例

powershell

# 判断远程主机是否可ping通
read -p "请输入IP地址: " ip
ping -c1 $ip &>/dev/null
if [ $? -eq 0 ]; then
    echo "$ip 可达"
else
    echo "$ip 不可达"
fi

2. case 语句

适用于多条件匹配场景:

powershell

case $变量 in
    模式1)
        命令1
        ;;
    模式2)
        命令2
        ;;
    *)
        默认命令
        ;;
esac

示例

powershell

read -p "请选择操作[1-3]: " num
case $num in
    1)
        echo "执行操作1"
        ;;
    2)
        echo "执行操作2"
        ;;
    3)
        echo "执行操作3"
        ;;
    *)
        echo "输入错误"
        ;;
esac

八、循环语句

1. for 循环

(1)列表循环

powershell

for 变量 in 列表; do
    命令
done

# 示例
for i in {1..5}; do
    echo $i
done
(2)类 C 风格循环

powershell

for ((expr1; expr2; expr3)); do
    命令
done

# 示例:打印1-5
for ((i=1; i<=5; i++)); do
    echo $i
done

2. while 循环

条件为真时执行循环体:

powershell

while [ 条件 ]; do
    命令
done

# 示例:打印1-5
i=1
while [ $i -le 5 ]; do
    echo $i
    let i++
done

3. until 循环

条件为假时执行循环体:

powershell

until [ 条件 ]; do
    命令
done

# 示例:打印1-5
i=1
until [ $i -gt 5 ]; do
    echo $i
    let i++
done

九、函数

1. 函数定义

powershell

# 格式1
函数名() {
    命令集合
}

# 格式2
function 函数名() {
    命令集合
}

2. 函数调用

powershell

# 定义函数
hello() {
    echo "Hello $1"
}

# 调用函数
hello World  # 输出:Hello World

3. 函数返回值

  • 使用return返回状态值(0-255)
  • 未指定return时,返回最后一条命令的退出状态

十、正则表达式

1. 基本元字符

元字符功能描述
.匹配任意单个字符(除换行符)
*前导字符出现 0 次或多次
.*匹配任意长度字符
^行的开头
$行的结尾
^$匹配空行
[]匹配指定字符组内的任一字符
[^]匹配不在指定字符组内的任一字符

2. 扩展元字符(需使用grep -Eegrep

元字符功能描述
+前导字符出现 1 次或多次
?前导字符出现 0 次或 1 次
``匹配多个选项中的一个
()分组匹配
{n}前导字符出现 n 次
{n,}前导字符至少出现 n 次
{n,m}前导字符出现 n 到 m 次

3. 示例

powershell

# 匹配IP地址
grep -E '([0-9]{1,3}\.){3}[0-9]{1,3}' file.txt

# 匹配邮箱地址
grep -E '^[0-9a-zA-Z]+@[0-9a-zA-Z]+\.[a-zA-Z]+$' file.txt

十一、总结

Shell 脚本是 Linux 系统管理的重要工具,掌握其基础语法(变量、运算、条件判断、循环、函数)和正则表达式,能极大提高工作效率。学习 Shell 脚本的关键在于:

  1. 熟悉常用 Linux 命令
  2. 掌握脚本基本格式和语法
  3. 多实践、多思考,从模仿到创新

通过不断练习,结合实际需求编写脚本,逐步提升 Shell 编程能力。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值