当前位置: 首页 > news >正文

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
http://www.xdnf.cn/news/1308493.html

相关文章:

  • 9.从零开始写LINUX内核——设置中断描述符表
  • RK3568 NPU RKNN(五):RKNN-ToolKit-lite2板端推理
  • linux I2C核心、总线与设备驱动
  • Dify实战应用指南(上传需求稿生成测试用例)
  • 守护品质安全,防伪溯源系统打造全链路信任体系
  • MySQL异步连接池的学习(五)
  • 海康机器人3D相机的应用
  • Docker目录的迁移
  • OpenCV Python——图像拼接(一)(图像拼接原理、基础知识、单应性矩阵 + 图像变换 + 拼接)
  • Python爬虫实战:研究Scrapy Spiders ,构建豆瓣网电影数据分析处理系统
  • CSV 生成 Gantt 甘特图
  • aws(学习笔记第五十一课) ECS集中练习(3)
  • 初识c语言————宏定义和调用
  • Trae中`settings.json`文件的Java配置项功能详解(一)
  • 云原生俱乐部-RH124知识点总结(1)
  • 安卓11 12系统修改定制化_____列举与安卓 9、10 系统在定制化方面的差异与权限不同
  • 【科普向-第一篇】数字钥匙生态全景:手机厂商、车厂与协议之争
  • Flutter Provider 模式实现:基于 InheritedWidget 的状态管理实现
  • 矩阵链相乘的最少乘法次数(动态规划解法)
  • 开源 Arkts 鸿蒙应用 开发(十七)通讯--http多文件下载
  • bilibili视频总结
  • RK3568 NPU RKNN(一):概念理清
  • 【P14 3-6 】OpenCV Python——视频加载、摄像头调用、视频基本信息获取(宽、高、帧率、总帧数)
  • 10-verilog的EEPROM驱动-单字节读写
  • 罗技MX Anywhere 2S鼠标修复记录
  • 多机编队——(6)解决机器人跟踪过程中mpc控制转圈问题
  • AT89C52单片机介绍
  • CVE-2024-28752漏洞复现
  • mysql一启动就挂的解决
  • Javar如何用RabbitMQ订单超时处理