Shell 脚本(Bash 版)
0x01 概述
(1)Shell 简介
-
Shell 是一个命令行解释器
flowchart LR 用户输入命令-->接收并将命令传递给内核执行-->将命令执行的结果返回给用户 -
Shell 种类丰富,包括 sh、csh、ksh、bash、zsh、fish 等
- 以下内容使用的是 bash(Bourne Again Shell)
- Linux 系统中默认安装的是 bash
- Windows 中使用的是 PowerShell,可以通过 WSL 或 Git Bash 在 Windows 系统中使用 bash
(2)查看 Shell 相关信息
cat /etc/shells
:查看系统中所有的 Shell 版本echo $SHELL
:当前系统默认使用的 Shell,类似形式的命令有:echo $0
:查看当前正在执行的脚本名称echo $HOME
:查看当前用户的家目录echo $PATH
:查看系统的查找路径
(3)编写 Shell 脚本
-
对于需要批量执行的命令,可以保存在 Shell 脚本中,从而实现自动化
-
Shell 脚本文件的扩展名一般为 .sh,也可以是其它扩展名
-
编写脚本:
-
新建脚本文件
touch hello.sh
-
使用 Vi 编辑脚本
vi hello.sh
-
按
i
键进入编辑模式(Vi 编辑器使用方法见Vim 安装与基础操作指南 | 博客园-SRIGT) -
第一行一般是用于指定使用的 Shell 种类
#!/bin/bash
-
之后写入需要执行的命令,默认自上向下依次执行
echo "Hello, shell script" # 文本输出 date # 日期与时间 whoami # 当前用户名
-
依次按
[ESC]
、:
、w
、q
保存脚本并退出 Vi 编辑器 -
使用命令
chmod a+x hello.sh
修改脚本文件执行权限 -
使用命令
./hello.sh
执行该脚本
-
-
Shell 脚本中,支持使用条件语句、循环语句、函数、局部变量等
-
举例:素数判断脚本
#!/bin/bash is_prime() { local num=$1 if [ $num -lt 2 ]; then return 1 fi for ((i=2; i*i<=num; i++)); do if [ $((num % i)) -eq 0 ]; then return 1 fi done return 0 } read -p "输入一个正整数: " number if is_prime $number; then echo "$number 是素数" else echo "$number 不是素数" fi
-
0x02 脚本基础
案例:使用 bash 编写 Shell 脚本实现“猜数游戏”
(1)输入与输出
#!/bin/bash
read -p "输入用户名: " name
echo "欢迎,$name"
read -p "提示内容" 变量名
echo "输出内容 $变量名"
#!/bin/bash
name=$1
echo "欢迎,$name"
- 使用命令
./game.sh SRIGT
执行脚本并设置第一个参数为SRIGT
name=$1
:将第一个参数赋值给变量name
$1
~$n
分别表示第 \(n\) 个参数$#
:传递给脚本或函数位置参数的个数$*
:传递给脚本或函数的位置参数,双引号包围时作为一个整体$@
:传递给脚本或函数的位置参数$$
:当前 Shell 进程的 PID$!
:最后一个后台命令的 PID$?
:上一命令的退出状态码
(2)变量
-
定义环境变量
name=SRIGT echo $name
-
在 Shell 脚本中使用环境变量的值
export name=SRIGT
# game.sh #!/bin/bash echo "欢迎,$name"
-
将自定义的环境变量永久保存
cd /etc/bash vi bash.bashrc
# bash.bashrc # 在文件的最后写入以下内容 export name=SRIGT
source bash.bashrc . bash.bashrc
(3)随机数
number=$(shuf -i 1-10 -n 1)
-
shuf -i 生成范围 -n 生成个数
-
在 Shell 脚本中,须要使用
$(命令)
或反引号将命令作为一个整体来处理
number=$((RANDOM % 10 + 1))
$RANDOM
:会随机生成 \(0-32767\) 之间的随机数
(4)条件判断
if [[ $guess -eq $number ]]; then
echo "猜中了"
elif [[ $guess -lt $number ]]; then
echo "猜小了"
elif [[ $guess -gt $number ]]; then
echo "猜大了"
else
echo "猜错了"
fi
-
条件判断语法
if condition; then # 语句 elif condition; then # 语句 else # 语句 if
-
条件测试表达式
condition
可以是:[]
:最基本的条件测试表达式[[]]
:扩展测试命令(())
:数学表达式,支持加减乘除等常见的数学运算
(5)循环
while true
do
read -p "输入1-10之间的数字作为猜数: " guess
if [[ $guess -eq $number ]]; then
read -p "猜中了, 是否继续(y/n)" choice
if [[ $choice = "y" ]] || [[ $choice = "Y" ]]; then
number=$(shuf -i 1-10 -n 1)
continue
else
break
fi
fi
done
-
for
循环语法:for ((condition 1; condition 2; condition 3)); do # 语句 done
-
while
循环语法:while condition do # 语句 done
-
continue
:继续循环 -
break
:跳出循环
完整代码
#!/bin/bash
echo "欢迎,$name"
number=$(shuf -i 1-10 -n 1)
while true
do
read -p "输入1-10之间的数字作为猜数: " guess
if [[ $guess -eq $number ]]; then
read -p "猜中了, 是否继续(y/n)" choice
if [[ $choice = "y" ]] || [[ $choice = "Y" ]]; then
number=$(shuf -i 1-10 -n 1)
continue
else
break
fi
elif [[ $guess -lt $number ]]; then
echo "猜小了"
elif [[ $guess -gt $number ]]; then
echo "猜大了"
else
echo "猜错了"
fi
done
-End-