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

Bash shell用法

目录

  • 变量引用
  • 多行注释
  • 参数
    • **1. 位置参数**
    • **2. 参数扩展**
    • **3. 特殊参数**
  • bash常见测试选项
    • **注意事项**
    • **常用组合示例**
  • 大括号扩展用法
    • **1. 扩展类用法**
      • **(1) 字符串扩展**
      • **(2) 数字序列扩展**
      • **(3) 变量扩展保护**
    • **2. 代码块类用法**
      • **(1) 组合命令(当前 Shell 执行)**
      • **(2) 匿名代码块(作用域隔离)**
    • **3. 特殊扩展技巧**
      • **(1) 前缀/后缀批量操作**
      • **(2) 嵌套扩展**
      • **(3) 与 for 循环结合**
    • **4. 注意事项**
    • 5. **经典应用场景**
  • shell写法优化
    • **1. 获取当前路径**
    • **2. 字符串拼接**
    • **3. 条件判断优化**
    • **4. 数组操作**
    • **5. 命令结果处理**
    • **6. 默认值与错误处理**
    • **7. 跳过无匹配项**
    • **8. 快速调试**

变量引用

NAME="John"为例:

语法输出结果说明
echo $NAMEJohn基本引用:简单但易出错(如值含空格或特殊字符时)
echo ${NAME}John推荐写法:明确变量边界,避免歧义
echo "$NAME"John引号保护:值含空格或特殊字符时保留原格式(如 "John Doe"
echo '$NAME'$NAME单引号:禁止变量扩展,原样输出
echo "${NAME}!"John!混合使用:变量后紧跟其他字符时必需(如 "${NAME}_suffix"

实际应用场景

  1. 安全引用值(始终推荐)

    file_path="/path/with spaces"
    cp "$file_path" /backup  # 正确:保留路径中的空格
    cp $file_path /backup    # 错误:会被拆分为多个参数
    
  2. 变量拼接

    user="Alice"
    echo "Hello, ${user}!"  # => Hello, Alice!
    echo "Hello, $user!"    # 也可工作,但不如 `${}` 清晰
    
  3. 防止歧义

    count=1
    echo "We have $countapple"     # 错误:解析为 `$countapple`(未定义的变量)
    echo "We have ${count}apple"   # 正确:=> We have 1apple
    
  4. 单引号用于原样输出

    echo '当前用户是 $USER'  # => 当前用户是 $USER
    

多行注释

使用 :<< 语法(最标准方式)

在 << COMMENT 和 COMMENT 之间的内容会被当成注释。单引号包裹的 'COMMENT' 可防止内容中的特殊字符被解析。可自定义终止标记(如 EOFBLOCK_COMMENT 等)

:<< 'COMMENT'
这是多行注释内容
可以写任意多行
变量不会被展开:$PATH
特殊字符也不会被解析:* ? []
COMMENT

参数

1. 位置参数

参数描述
$0脚本名称(如 ./script.sh
$1 - $9第 1 到第 9 个参数
${10}+第 10 个及以后的参数(必须用花括号)
$#参数的总个数
$@所有参数的列表(每个参数作为独立字符串,推荐使用)
$*所有参数的列表(合并为单个字符串,用空格分隔,慎用)

示例

#!/bin/bash
echo "脚本名: $0"
echo "第一个参数: $1"
echo "所有参数: $@"
echo "参数总数: $#"

2. 参数扩展

用于对参数进行高级操作:

语法描述
${var:-default}如果 var 未设置或为空,返回 default
${var:=default}如果 var 未设置或为空,将其赋值为 default 并返回
${var:?error_msg}如果 var 未设置或为空,打印 error_msg 并退出脚本
${var:+replacement}如果 var 已设置且非空,返回 replacement
${var:offset:len}varoffset 位置开始截取 len 长度的子字符串
${#var}返回 var 的字符串长度
${var#pattern}删除 var 开头匹配 pattern 的最短部分
${var##pattern}删除 var 开头匹配 pattern 的最长部分
${var%pattern}删除 var 结尾匹配 pattern 的最短部分
${var%%pattern}删除 var 结尾匹配 pattern 的最长部分
${var/old/new}var 中第一个 old 替换为 new
${var//old/new}var 中所有 old 替换为 new

示例

name="John Doe"
echo ${name:-"Guest"}      # 如果 name 为空则输出 "Guest"
echo ${name:0:4}           # 输出 "John"
echo ${name#J}             # 输出 "ohn Doe"
echo ${name//o/X}          # 输出 "JXhn DXe"

3. 特殊参数

参数描述
$?上一个命令的退出状态(0 表示成功,非 0 表示失败)
$$当前 Shell 进程的 PID
$!最后一个后台进程的 PID
$_上一个命令的最后一个参数

示例

grep "pattern" file.txt
if [ $? -ne 0 ]; thenecho "查找失败"
fi

bash常见测试选项

选项含义示例典型用途
字符串测试
-z检查字符串是否为空[ -z "$var" ]验证必填参数
http://www.lryc.cn/news/589075.html

相关文章:

  • 轻松管理多个Go版本:g工具安装与使用
  • 【自学linux】计算机体系结构和操作系统第二章
  • OpenCV 伽马校正函数gammaCorrection()
  • PG备份一(逻辑备份)
  • 算法与前端的可访问性
  • Linux系统调优和工具
  • OpenCV-Python Tutorial : A Candy from Official Main Page(三)
  • 【Linux系统】命令行参数和环境变量
  • 涨停板池,跌停板池,炸板池,次新股池,强势股池数据接口
  • SSM框架学习DI入门——day2
  • Flutter瀑布流布局深度实践:打造高性能动态图片墙
  • 基于Ruoyi和PostgreSQL的统一POI分类后台管理实战
  • IPSec和HTTPS对比(一)
  • 前端学习笔记:React.js中state和props的区别和联系
  • 数字影像新风口 入驻国际数字影像产业园解锁151项全周期服务
  • 20.如何在 Python 字典中找到最小值或最大值的键?
  • 关于list
  • 使用 PowerMockito 模拟 new A() 行为
  • 文心一言开源版部署及多维度测评实例
  • linux-线程互斥
  • 硬件设计学习DAY1——电源的分类
  • HAProxy 简介及配置文件详解
  • nlp论文:分本分类:《Bag of Tricks for Efficient Text Classification》
  • 渭河SQL题库-- 来自渭河数据分析
  • 5.数据归一化
  • Python爬虫实战:研究Mistune库相关技术
  • UE5多人MOBA+GAS 23、制作一个地面轰炸的技能
  • Typecho插件开发:实现文章字数统计与阅读时长计算功能
  • Docker镜像导入、导出操作指南
  • 大型语言模型(LLM)的技术面试题