Bash
-
-
- 一、基础结构
-
- [1.1 如何运行脚本](#1.1 如何运行脚本)
- [1.2 如何注释](#1.2 如何注释)
- 二、变量
-
- [2.1 定义与使用变量](#2.1 定义与使用变量)
- [2.2 命令输出赋值给变量](#2.2 命令输出赋值给变量)
- [2.3 位置参数 (命令行参数)](#2.3 位置参数 (命令行参数))
- [2.4 只读变量](#2.4 只读变量)
- 三、输入输出
-
- [3.1 echo](#3.1 echo)
- [3.2 read](#3.2 read)
- 四、引号
- 五、条件判断(if/else)
-
- [5.1 基本语法](#5.1 基本语法)
- [5.2 常用的比较运算符号](#5.2 常用的比较运算符号)
- 六、循环
-
- [6.1 for](#6.1 for)
- [6.2 while](#6.2 while)
- [6.3 until 循环](#6.3 until 循环)
- 七、分支选择case
- 八、函数
- 九、算术运算
- 十、退出脚本
- 十一、示例
-
一、基础结构
脚本的第一行,告诉系统使用哪个解释器来执行此脚本。
bash
#!/bin/bash
示例
bash
#!/bin/bash
echo "Hello, World!"
1.1 如何运行脚本
chmod +x script.sh
(赋予执行权限)./script.sh
(在当前目录执行)- 或者
bash script.sh
(显式指定用 bash 解释)
1.2 如何注释
使用 # 开始一行注释
示例:
bash
# 这是一个单行注释
echo "This is code" # 行内注释
二、变量
2.1 定义与使用变量
- 变量名区分大小写,通常大写表示常量,小写表示变量。
- 定义:变量名=值 ( 等号两边不能有空格! )
- 使用:变量名 或 {变量名} (推荐后者,明确边界)。
示例:
bash
name="Alice" # 定义变量
greeting="Hello, $name!" # 使用变量
echo $greeting # 输出: Hello, Alice!
echo "My name is ${name}." # 输出: My name is Alice. (明确边界)
2.2 命令输出赋值给变量
使用反引号 ` 或 $() (推荐后者,更易嵌套)。
示例:
bash
current_date=$(date) # 将 date 命令的输出赋值给 current_date
echo "Today is: $current_date"
2.3 位置参数 (命令行参数)
$0: 脚本名本身
$1, $2, $3, ...: 第一个、第二个、第三个...命令行参数。
$#: 传递给脚本的参数个数。
$@ 或 $*: 所有命令行参数列表 (细微差别:"$@" 是 "arg1" "arg2" ..., "$*" 是 "arg1 arg2...")。
运行:./greet.sh ty ty2
输出:
c
Script name: ./greet.sh
First argument: ty
Second argument: ty2
Total arguments: 2
All arguments: ty ty2
2.4 只读变量
使用 readonly 声明。
示例:
bash
readonly PI=3.14159
PI=4 # 会报错: PI: readonly variable
三、输入输出
3.1 echo
bash
echo "Simple text"
echo -e "Line 1\nLine 2" # -e 启用反斜杠转义 (\n 换行)
echo "Value of PATH is: $PATH"
3.2 read
从标准输入读取一行,赋值给变量
bash
echo "What's your name?"
read user_name # 读取输入到变量 user_name
echo "Hello, $user_name!"
read -p "Enter your age: " user_age # -p 显示提示符
echo "You are $user_age years old."
四、引号
- 单引号 ' ': 内部所有内容原样输出,不进行变量替换和转义。
示例
bash
var='world'
echo 'Hello $var' # 输出: Hello $var
双引号 " ": 会进行变量替换 ($var) 和命令替换 ($(cmd)),并处理大部分转义 (\n, \t 等)。
示例:
bash
var='world'
echo "Hello $var" # 输出: Hello world
echo -e "Line1\nLine2" # 需要 -e 选项使 \n 生效 (或者在双引号内直接用)
五、条件判断(if/else)
5.1 基本语法
- if 后面跟 [ ] ( 方括号内部两边必须有空格! )。
- if 语句以 fi 结束。
示例:
bash
#!/bin/bash
num=10
if [ $num -gt 5 ]; then # [ $num -gt 5 ] 是 test 命令的写法
echo "$num is greater than 5"
fi
if [ $num -eq 10 ]; then
echo "$num is equal to 10"
else
echo "$num is not equal to 10"
fi
5.2 常用的比较运算符号
数值比较
- -eq: 等于 (Equal)
- -ne: 不等于 (Not Equal)
- -gt: 大于 (Greater Than)
- -ge: 大于等于 (Greater or Equal)
- -lt: 小于 (Less Than)
- -le: 小于等于 (Less or Equal)
字符串比较
- =, : 等于 (在 [ ] 和 [[ ]] 中通用, 在 [[ ]] 中更符合习惯)
- !=: 不等于
- -z "string": 字符串长度为 0 (空)
- -n "string": 字符串长度非 0 (非空)
bash
if [ -z "$str" ]; then
echo "字符串为空"
fi
bash
if [ -n "$str" ]; then
echo "字符串非空(长度大于0)"
fi
六、循环
6.1 for
bash
# 遍历值列表
for fruit in apple banana orange; do
echo "I like $fruit"
done
# 遍历命令输出 (每行一个元素)
for file in $(ls *.txt); do # 遍历当前目录所有 .txt 文件
echo "Processing file: $file"
# 可以对 $file 进行操作
done
6.2 while
条件为真时持续循环
bash
# 计数器
count=1
while [ $count -le 5 ]; do
echo "Count: $count"
count=$((count + 1)) # 算术运算 $(( ... ))
done
# 读取文件行
while read line; do
echo "Line: $line"
done < /path/to/file.txt # 输入重定向
# 无限循环 (通常配合 break)
while true; do
echo "Press [CTRL+C] to stop.."
sleep 1
done
6.3 until 循环
条件为假时持续循环 (与 while 相反)。
bash
count=10
until [ $count -eq 0 ]; do
echo "Countdown: $count"
count=$((count - 1))
done
echo "Blast off!"
七、分支选择case
bash
#!/bin/bash
echo "Enter a fruit (apple, banana, orange):"
read fruit
case $fruit in
apple)
echo "You chose apple. $1 per kg." # $1 是命令行第一个参数
;;
banana)
echo "You chose banana."
;;
orange)
echo "You chose orange."
;;
*) # 默认匹配所有其他情况
echo "Unknown fruit: $fruit"
;;
esac
结果:
八、函数
- 使用 function name() 或 name() 定义。
- 函数内部使用 1, 2, ... 访问参数 ($0 仍然是脚本名)。
- 使用 return 返回退出状态码 (0-255),使用 ? 获取。注意: return
返回的是状态码,不是函数的输出值。要返回数据,通常用 echo 输出,然后通过命令替换 (func) 捕获。
#!/bin/bash
bash
# 定义函数
greet() {
local message="Hello, $1!" # local 定义局部变量
echo $message
return 0 # 成功退出
}
# 调用函数,并捕获其输出
result=$(greet "Alice")
echo "The greeting is: $result"
exit_status=$?
echo "Function exited with status: $exit_status" # 输出: 0
# 另一个函数,计算平方
square() {
local num=$1
echo $((num * num)) # 输出计算结果
}
sq=$(square 5)
echo "5 squared is $sq" # 输出: 5 squared is 25
九、算术运算
c
使用 $(( ))
bash
a=5
b=3
sum=$((a + b)) # 加
diff=$((a - b)) # 减
prod=$((a * b)) # 乘
quot=$((a / b)) # 除 (整数除法)
rem=$((a % b)) # 取模
pow=$((a ** b)) # 幂 (a^b)
((a++)) # 自增: a = a + 1 (等同于 a=$((a+1)))
((b--)) # 自减
echo "Sum: $sum, Product: $prod, Power: $pow"
echo "After increment: a=$a"
结果:
十、退出脚本
bash
exit
无论在主函数,还是自定义函数,都将退出脚本运行。
十一、示例
bash
#!/bin/bash
#author:tangyong
#date:2025-08-15
#des:适用于SSD、nvidia、docker的安装
set -e #开启 "错误退出"
function InstallDocker()
{
set -e # 函数内显式启用
# 1.卸载旧版本 Docker(如有)
sudo apt remove docker docker-engine docker.io containerd runc
sudo apt purge docker-ce docker-ce-cli containerd.io
# 2.安装依赖工具
sudo apt update
sudo apt install -y apt-transport-https ca-certificates curl software-properties-common gnupg
# 3.添加Docker GPG秘钥
curl -fsSL https://mirrors.aliyun.com/docker-ce/linux/ubuntu/gpg | sudo gpg --dearmor -o /etc/apt/keyrings/docker.gpg
# 4.配置仓库源
echo \
"deb [arch="$(dpkg --print-architecture)" signed-by=/etc/apt/keyrings/docker.gpg] https://mirrors.aliyun.com/docker-ce/linux/ubuntu \
"$(. /etc/os-release && echo "$VERSION_CODENAME")" stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
# 5.安装Docker Engine
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
# 6.启动Docker
sudo systemctl start docker
# 7.设置开机自启
sudo systemctl status docker
# 8.测试docker 是否安装成功
docker run hello-world
}
InstallDocker