shell脚本中的#、%和##、%%的作用

本文深入探讨了Shell中变量模式匹配的使用技巧,包括从左右两侧进行匹配的语法,如${var%pattern}
${var%pattern},${var%%pattern} 从右边开始匹配
${var#pattern},${var##pattern} 从左边开始匹配
${var%pattern} ,${var#pattern} 表示最短匹配,匹配到就停止,非贪婪
${var%%pattern},${var##pattern} 是最长匹配
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 /  及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 .  及其左边的字符串:file.txt
${file##*.}:删掉最后一个 .  及其左边的字符串:txt
${file%/*}:删掉最后一个  /  及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 /  及其右边的字符串:(空值)
${file%.*}:删掉最后一个  .  及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个  .   及其右边的字符串:/dir1/dir2/dir3/my

记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2
<think>好的,用户问的是在Shell脚本中,%是否代表最末尾。我需要仔细回忆一下Shell中字符串操作的相关知识。 首先,我记得在Shell的参数扩展中,%#都是用来处理变量内容的。%用于从变量值的末尾删除匹配的模式,而#是从开头删除。比如${var%pattern}会删除var值中末尾最短匹配pattern的部分,而%%则是删除最长匹配的部分。 用户可能在使用变量处理文件名或者路径时遇到了问题,比如想要去掉文件名的后缀。例如,如果有一个变量file="file.txt",使用${file%.*}就能得到"file"。这时候%作用就是去除末尾的.txt扩展名。 不过用户的问题是关于%是否代表最末尾,可能需要澄清的是,%本身并不直接代表末尾,而是在进行模式匹配时,用来指示从末尾开始删除。这里的模式遵循通配符的规则,比如*代表任意字符。所以,当使用%时,模式是从变量值的末尾开始匹配的。 另外,用户可能混淆了其他上下文中%的用法,比如在算术运算中的取余操作,或者在sed、awk等工具中的不同含义。需要明确这里讨论的是Shell参数扩展中的%符号。 可能用户实际遇到的情况是,在处理字符串时,希望截取某个部分,但不确定%的正确用法。这时候需要举例说明,比如处理文件名后缀、目录路径等常见用例,帮助用户理解。 还需要注意,%%%的区别,一个是非贪婪匹配,一个是贪婪匹配。例如,file="file.tar.gz",${file%.*}得到"file.tar",而${file%%.*}得到"file"。这时候双百分号的作用就体现出来了。 总结来说,%Shell参数扩展中用于从末尾删除匹配的最短模式,而%%删除最长模式。它不是代表最末尾本身,而是操作的方向是从末尾开始匹配。需要确保用户理解模式匹配的机制,并提供实际例子帮助其掌握用法。</think>在 Shell 脚本中,`%` 符号的作用需要结合具体场景理解,它并不直接代表"最末尾",而是主要用于以下两种场景: $\textcolor{red}{重要说明}$ 当用于字符串操作时: 1. `${var%pattern}`:从变量值的$\textcolor{blue}{末尾}$开始,删除$\textcolor{blue}{最短}$匹配的模式 2. `${var%%pattern}`:从变量值的$\textcolor{blue}{末尾}$开始,删除$\textcolor{blue}{最长}$匹配的模式 $\textcolor{green}{具体案例演示}$ ```bash file="document.tar.gz" echo ${file%.*} # 输出 document.tar(删除最短匹配的 .gz) echo ${file%%.*} # 输出 document(删除最长匹配的 .tar.gz) ``` $\textcolor{purple}{对比用法}$ ```bash path="/home/user/file.txt" echo ${path#*/} # 输出 home/user/file.txt(从开头删除最短匹配) echo ${path##*/} # 输出 file.txt(从开头删除最长匹配) ``` $\textcolor{orange}{注意事项}$ 1. 在算术运算中:`%` 表示取余操作,如 `$((10%3))` 输出 1 2. 在模式匹配时:`%` 需要配合通配符 `*` 使用才有意义 3. 在后台进程标识中:`%1` 表示第一个后台作业 $\textcolor{brown}{典型应用场景}$ 处理文件扩展名时非常有用: ```bash filename="photo.jpg" name_only=${filename%.*} # 得到 photo ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值