Bash常用操作总结

Bash

一、基础结构

脚本的第一行,告诉系统使用哪个解释器来执行此脚本。

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
相关推荐
weixin_382395234 小时前
为小工厂量身打造:本地部署的物料管理系统带缺料计算
前端·制造
__zRainy__4 小时前
解决pnpm v10+不自动构建
前端·pnpm·工程化
猫猫不是喵喵.5 小时前
Vue3 Props 属性
前端·javascript·vue.js
醉城夜风~6 小时前
CSS元素显示模式(display)
前端·css
AI大模型-小华7 小时前
Codex 三方充值快速入门指南
java·前端·数据库·chatgpt·ai编程·codex·chatgpt pro
做前端的娜娜子9 小时前
同一链接实现 PC Web 与移动 H5 自适应
前端·掘金·金石计划
小帅不太帅9 小时前
架构没变、规模没变,DeepSeek V4 Flash 正式版凭什么暴涨 47 分?
前端·aigc·deepseek
jarvisuni10 小时前
DeepSeekFlash前端依旧拉垮,而且变慢了很多!
前端·javascript·算法
卷福同学11 小时前
AI编程出海第二步:验证关键词能否做站
前端·人工智能·后端