参数展开(parameter expansion)

参数展开是shell变量在程序中使用的过程。在shell中变量使用$varname 来引用变量。

变量名称可以括在花括号里(${variable}),括号里面可以增加一些额外语法,执行额外功能。

替换运算符(:)

           运算符(:)是可选的,如果省略冒号,则将每个定义中的‘存在且非null' 修改为 ’存在‘

运算符用途说明
${varname:-default}如果变量未定义,则返回默认值如果varname存在且非null,则返回其值;否则返回default默认值
${varname:=default}如果变量未定义,则设置为默认值如果varname存在且非null,则返回其值;否则设置变量为default,并返回其值
${varname:?msg}为了捕捉由于变量未定义所导致的错误,显示提示信息

如果varname存在且非null,则返回其值;否则显示varname:msg,并退出当前的命令或者脚本。省略msg,会显示默认信息‘parameter null or not set’。

交互式shell不需要退出

${varname:+msg}为测试变量的存在如果varname存在且非null,则返回msg;否则返回null


模式匹配运算符(# %)

            # 从开头开始匹配
            % 从尾部开始匹配
            
eg: path=/home/tost/mem/long.file.name               

运算符用途说明
${varname#pattern}从变量值的开头处匹配,则删除匹配的最短部分,并返回剩下的部分例:${path#/*/},返回 tost/mem/long.file.name
${varname##pattern}变量开头处匹配,匹配最长部分,并返回剩下部分例:${path##/*/},返回 long.file.name
${varname%pattern}变量尾部匹配,匹配最短部分,并返回剩下部分例:${path%.*},返回 /home/tost/mem/long.file
${varname%%pattern}
变量尾部匹配,匹配最长部分,并返回剩下部分

例:${path%%.*},返回 /home/tost/mem/long

位置参数(positional parameter)

         shell脚本的命令行参数,也表示shell函数内的函数参数。
        位置参数名称以单个整数来命名,当这个整数大于9时,使用花括号{}括起来。
       
         
变量说明
$#传递给shell脚本或函数的参数总数
$* $@一次表示所有的命令行参数
“$*”将所有命令行中参数视为单个字符串。等同于“ $1 $2 $3 ...”
"$@"将所有命令行参数的每个视为单独字符串。等同于 “$1” "$2" "$3" 


特殊参数

   POSIX 内置Shell变量
  
变量说明
#目前参数个数
@传递给当前进程的命令行参数,在双引号内,每个参数会生成一个字符串
*传递给当前进程的命令行参数,双引号内,所有参数生成一个字符串
-(连字号)shell选项
前一个命令的退出状态
$shell程序的名称
0(零)shell程序名称
最近一个后台命令的进程编号,可通过wait命令以供稍后使用
ENV一旦引用,则仅用于交互式Shell中,$ENV的值是可展开的参数。结果应为要读取和在启动时要要执行的一个文件的完整路径名称。这是一个XSI必需的变量
HOME用户根登陆目录
IFS内部的字段分隔符
LANGlocale默认值,其他LC_*变量会覆盖其值
LC_ALL当前locale的名称;会覆盖LANG与其他LC_*变量
LC_COLLATE用来排序字符的当前locale名称
LC_CTYPE模式匹配期间,字符类别的当前locale
LC_MESSAGES当前语言的名称
LINENO刚执行过的函数或者脚本内的行编号
NLSPATH在$LC_MESSAGES(XSI)所给定的信息语言里,信息目录的位置
PATH 
PPID父进程的进程编号
PS1主要命令提示字符串,默认为 $
PS2行继续提示字符串 默认 >
PS4以set -x 设置的执行跟踪的提示字符串 默认 +
PWD当前工作目录
  
         
<think>好的,用户之前问了关于LAMP架构中PHP在没有模块或FPM的情况下如何工作的问题,现在他们又转向了Shell脚本中的参数扩展语法。我需要先确认用户的学习路径或者使用场景。可能他们正在学习服务器管理,涉及到自动化脚本编写,因此需要掌握Shell脚本的高级功能,比如参数扩展。 首先,参数扩展在Bash脚本中确实是一个重要的部分,用户可能已经了解基础的内容,比如位置参数$2等),现在想深入学习更高级的用法。用户的问题比较直接,但可能需要详细的解释和例子来帮助理解不同参数扩展的用法和适用场景。 我需要先回顾参数扩展的基本概念,然后分门别类地介绍各种扩展语法,比如变量替换、字符串操作、默认值设置、间接引用等。同时,用户可能希望有实际的例子来说明每个语法的用途,这样他们可以更好地理解和应用在自己的脚本中。 需要注意的是,参数扩展语法有很多种,有些可能不太常用,但像${var:-default}这样的结构在脚本中处理默认值时非常有用。用户可能在实际编写脚本时遇到需要处理未定义变量或者空值的情况,这时候这些扩展就派上用场了。 另外,用户可能对字符串操作感兴趣,比如截取子串、替换内容、大小写转换等。这些操作在文件处理或者字符串处理时非常实用。例如,批量重命名文件时可能需要用到字符串替换或者截取部分文件名。 还要考虑到用户可能的误区,比如间接引用和数组操作,这些稍微复杂一些,需要清晰的解释和例子。比如,${!var}这种间接引用可能对于新手来说不太直观,需要用简单的例子说明其工作机制。 最后,总结部分需要强调参数扩展的强大功能,以及如何提升脚本的效率和可读性。同时,提醒用户注意不同Shell的兼容性问题,比如Bash特有的语法可能在sh或其他Shell中不可用,确保他们的脚本在目标环境中能够正确运行。 可能用户的需求是优化现有的脚本,或者解决某个具体问题,比如处理文件路径、设置默认配置项、字符串处理等。通过提供全面的参数扩展语法介绍和实例,用户可以更高效地编写和维护他们的Shell脚本。</think>Shell 脚本(如 Bash)中的**参数扩展**(Parameter Expansion)是一种强大的语法功能,用于对变量参数的值进行动态操作,例如截取子串、替换内容、设置默认值等。以下是常见的参数扩展语法及其用途: --- ### **1. 基础变量替换** ```bash ${var} # 获取变量值(等同于 $var) ${var-word} # 若 var 未定义,返回 word(变量值不修改) ${var:-word} # 若 var 未定义或为空,返回 word(变量值不修改) ${var=word} # 若 var 未定义,设置 var=word 并返回 word ${var:=word} # 若 var 未定义或为空,设置 var=word 并返回 word ${var+word} # 若 var 已定义,返回 word(无论是否为空) ${var:+word} # 若 var 已定义且非空,返回 word ``` **示例**: ```bash name="" echo ${name:-"Guest"} # 输出 Guest(name 为空) echo ${unset_var-"默认值"} # 输出 默认值 ``` --- ### **2. 字符串截取** ```bash ${var:offset} # 从 offset 开始截取到末尾(下标从 0 开始) ${var:offset:len} # 从 offset 截取长度为 len 的子串 ${#var} # 获取字符串长度 ``` **示例**: ```bash str="Hello World" echo ${str:6} # 输出 "World" echo ${str:0:5} # 输出 "Hello" echo ${#str} # 输出 11 ``` --- ### **3. 字符串替换** ```bash ${var/pattern/replacement} # 替换第一个匹配的 pattern ${var//pattern/replacement} # 替换所有匹配的 pattern ${var/#pattern/replacement} # 替换开头的 pattern ${var/%pattern/replacement} # 替换结尾的 pattern ``` **示例**: ```bash path="/home/user/docs/file.txt" echo ${path/doc/DOC} # /home/user/DOCs/file.txt(替换第一个) echo ${path//\//-} # -home-user-docs-file.txt(替换所有 /) ``` --- ### **4. 删除子串** ```bash ${var#pattern} # 删除开头最短匹配的 pattern ${var##pattern} # 删除开头最长匹配的 pattern ${var%pattern} # 删除结尾最短匹配的 pattern ${var%%pattern} # 删除结尾最长匹配的 pattern ``` **示例**: ```bash file="backup.tar.gz" echo ${file%.*} # backup.tar(删除末尾 .gz) echo ${file%%.*} # backup(删除所有后缀) echo ${file#*.} # tar.gz(删除开头至第一个 .) echo ${file##*.} # gz(删除开头至最后一个 .) ``` --- ### **5. 大小写转换** ```bash ${var^^} # 所有字符转为大写 ${var,,} # 所有字符转为小写 ${var^} # 首字母转为大写 ${var,} # 首字母转为小写 ``` **示例**: ```bash str="hello" echo ${str^^} # HELLO echo ${str^} # Hello ``` --- ### **6. 数组操作** ```bash ${array[@]} # 展开数组所有元素 ${array[*]} # 展开数组为单个字符串(元素由 IFS 分隔) ${#array[@]} # 数组元素个数 ${array[index]} # 获取指定索引的元素 ${array[@]:start:len} # 截取数组子集 ``` **示例**: ```bash arr=("a" "b" "c") echo ${arr[@]:1:2} # 输出 b c echo ${#arr[@]} # 输出 3 ``` --- ### **7. 间接引用(变量间接取值)** ```bash ${!var} # 通过变量名间接取值(例如 var="name"; name="John" → ${!var} 返回 John) ``` **示例**: ```bash var="PATH" echo ${!var} # 输出环境变量 PATH 的值 ``` --- ### **8. 特殊参数扩展** ```bash ${@} # 所有位置参数(每个参数独立) ${*} # 所有位置参数(合并为单个字符串) ${#@} # 位置参数个数 ${0} # 脚本名称 ${1}, ${2}... # 第 1、2 个位置参数 ${@:start:n} # 从 start 开始取 n 个参数 ``` --- ### **总结** - **参数扩展**是 Shell 脚本中处理字符串、变量和数组的核心工具。 - 通过灵活组合,可以高效完成字符串操作、默认值设置、动态替换等任务。 - 注意不同 Shell 的兼容性(例如部分语法仅限 Bash,而 `sh` 可能不支持)。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值