Bash常用操作总结
Bash
- 一、基础结构
- 1.1 如何运行脚本
- 1.2 如何注释
- 二、变量
- 2.1 定义与使用变量
- 2.2 命令输出赋值给变量
- 2.3 位置参数 (命令行参数)
- 2.4 只读变量
- 三、输入输出
- 3.1 echo
- 3.2 read
- 四、引号
- 五、条件判断(if/else)
- 5.1 基本语法
- 5.2 常用的比较运算符号
- 六、循环
- 6.1 for
- 6.2 while
- 6.3 until 循环
- 七、分支选择case
- 八、函数
- 九、算术运算
- 十、退出脚本
- 十一、示例
一、基础结构
脚本的第一行,告诉系统使用哪个解释器来执行此脚本。
#!/bin/bash
示例
#!/bin/bash
echo "Hello, World!"
1.1 如何运行脚本
chmod +x script.sh
(赋予执行权限)./script.sh
(在当前目录执行)- 或者
bash script.sh
(显式指定用 bash 解释)
1.2 如何注释
使用 # 开始一行注释
示例:
# 这是一个单行注释
echo "This is code" # 行内注释
二、变量
2.1 定义与使用变量
- 变量名区分大小写,通常大写表示常量,小写表示变量。
- 定义:变量名=值 ( 等号两边不能有空格! )
- 使用:$变量名 或 ${变量名} (推荐后者,明确边界)。
示例:
name="Alice" # 定义变量
greeting="Hello, $name!" # 使用变量
echo $greeting # 输出: Hello, Alice!
echo "My name is ${name}." # 输出: My name is Alice. (明确边界)
2.2 命令输出赋值给变量
使用反引号 ` 或 $() (推荐后者,更易嵌套)。
示例:
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
输出:
Script name: ./greet.sh
First argument: ty
Second argument: ty2
Total arguments: 2
All arguments: ty ty2
2.4 只读变量
使用 readonly 声明。
示例:
readonly PI=3.14159
PI=4 # 会报错: PI: readonly variable
三、输入输出
3.1 echo
echo "Simple text"
echo -e "Line 1\nLine 2" # -e 启用反斜杠转义 (\n 换行)
echo "Value of PATH is: $PATH"
3.2 read
从标准输入读取一行,赋值给变量
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."
四、引号
- 单引号 ’ ': 内部所有内容原样输出,不进行变量替换和转义。
示例
var='world'
echo 'Hello $var' # 输出: Hello $var
双引号 " ": 会进行变量替换 ($var) 和命令替换 ($(cmd)),并处理大部分转义 (\n, \t 等)。
示例:
var='world'
echo "Hello $var" # 输出: Hello world
echo -e "Line1\nLine2" # 需要 -e 选项使 \n 生效 (或者在双引号内直接用)
五、条件判断(if/else)
5.1 基本语法
- if 后面跟 [ ] ( 方括号内部两边必须有空格! )。
- if 语句以 fi 结束。
示例:
#!/bin/bash
num=10if [ $num -gt 5 ]; then # [ $num -gt 5 ] 是 test 命令的写法echo "$num is greater than 5"
fiif [ $num -eq 10 ]; thenecho "$num is equal to 10"
elseecho "$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 (非空)
if [ -z "$str" ]; thenecho "字符串为空"
fi
if [ -n "$str" ]; thenecho "字符串非空(长度大于0)"
fi
六、循环
6.1 for
# 遍历值列表
for fruit in apple banana orange; doecho "I like $fruit"
done# 遍历命令输出 (每行一个元素)
for file in $(ls *.txt); do # 遍历当前目录所有 .txt 文件echo "Processing file: $file"# 可以对 $file 进行操作
done
6.2 while
条件为真时持续循环
# 计数器
count=1
while [ $count -le 5 ]; doecho "Count: $count"count=$((count + 1)) # 算术运算 $(( ... ))
done# 读取文件行
while read line; doecho "Line: $line"
done < /path/to/file.txt # 输入重定向# 无限循环 (通常配合 break)
while true; doecho "Press [CTRL+C] to stop.."sleep 1
done
6.3 until 循环
条件为假时持续循环 (与 while 相反)。
count=10
until [ $count -eq 0 ]; doecho "Countdown: $count"count=$((count - 1))
done
echo "Blast off!"
七、分支选择case
#!/bin/bash
echo "Enter a fruit (apple, banana, orange):"
read fruitcase $fruit inapple)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
# 定义函数
greet() {local message="Hello, $1!" # local 定义局部变量echo $messagereturn 0 # 成功退出
}# 调用函数,并捕获其输出
result=$(greet "Alice")
echo "The greeting is: $result"
exit_status=$?
echo "Function exited with status: $exit_status" # 输出: 0# 另一个函数,计算平方
square() {local num=$1echo $((num * num)) # 输出计算结果
}sq=$(square 5)
echo "5 squared is $sq" # 输出: 5 squared is 25
九、算术运算
使用 $(( ))
a=5
b=3sum=$((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"
结果:
十、退出脚本
exit
无论在主函数,还是自定义函数,都将退出脚本运行。
十一、示例
#!/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 runcsudo apt purge docker-ce docker-ce-cli containerd.io# 2.安装依赖工具sudo apt updatesudo 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 Enginesudo apt updatesudo apt install -y docker-ce docker-ce-cli containerd.io# 6.启动Dockersudo systemctl start docker# 7.设置开机自启sudo systemctl status docker# 8.测试docker 是否安装成功docker run hello-world
}InstallDocker