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
相关推荐
AliciaIr17 分钟前
深入理解HTTP:从协议基础到版本演进(上)
前端·http
pepedd86420 分钟前
数组字符串方法有哪些-带你重温js基础
前端·javascript·trae
pepedd86421 分钟前
深入理解js作用域-你真的懂js吗
前端·javascript·trae
阿迪州22 分钟前
[函数式编程] 为什么要柯里化?
前端
Cache技术分享31 分钟前
162. Java Lambda 表达式 - Consumer 的链式组合
前端·后端
是晓晓吖35 分钟前
为什么在Tab中取不到content.js给window设置的变量/函数?
前端·chrome
日月晨曦37 分钟前
JS闭包:变量的"守护者"与"储物间"
前端·javascript
袁煦丞38 分钟前
轻量级网络大佬Nginx打开公网自由之路:cpolar内网穿透实验室第625个成功挑战
前端·程序员·远程工作
日月晨曦39 分钟前
TypeScript:让JavaScript穿上西装革履
前端·typescript
cvpv39 分钟前
优雅!太优雅!斯巴拉西!怎么让AI写出最优雅的代码
前端·typescript·trae