shell中 #*, ##*, %*, %%*的含义及用法

文章介绍了Bash脚本中用于字符串处理的特殊语法,如#*用于删除最小匹配的左边部分,##*删除最长匹配的左边部分,%*移除右边的部分,而%%*则用于提取文件的根目录。这些技巧在处理文件路径和名称时特别有用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、#*的用法(最小匹配)左边

VAR="/opt/software/hadoop/a.txt"
VAR=${VAR#*/}
echo $VAR

此时,第一条/和它左边的都被删除了
最小匹配也就是找的第一个/

 2、##*(最长匹配) 左边

VAR="opt/software/hadoop/a.text"
VAR=${VAR##*/}
echo $VAR

此时可以看出,最后一个/以及左边的全被删除了

 3、%*  含义:右边和它右边的东西被删除

VAR="/opt/software/hadoop/a.txt"
VAR=${VAR%/*}
echo $VAR

可以看出,右边第一个/和它右边的东西删除了

#号适合提取文件名字,%号适合提取路径

4、%%*    适合:提取文件的根目录

VAR="opt/software/hadoop/a.txt"
VAR=${VAR%%/*}
echo $VAR

 //这个时候opt前面不能加/,如果加了,提取到的就是空字符

记忆的方法为:
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配

<think>嗯,用户问的是C语言中%6d##代表什么。首先,我需要回忆一下C语言的printf格式说明符的结构。通常,格式说明符以%开头,后面跟着一些可选的修饰符,然后是转换字符,比如d、f、s等。 用户提到的%6d##,这里看起来有两个部分:%6d和后面的##。我知道%6d中的6是指定字段宽度,表示输出整数时至少占6个字符,不足的话用空格填充,右对齐。比如,如果数字是123,用%6d会输出“ 123”(前面三个空格)。 但后面的##让我有点困惑。在C语言的标准格式说明符中,没有##这样的修饰符。可能用户混淆了格式说明符的结构,或者可能##是用户代码中的其他内容,被误解为格式字符串的一部分。 这时候需要进一步分析。##可能在代码中的上下文是什么样子的。例如,用户可能在写printf("%6d##", num);这样的话,%6d是格式说明符,后面的##就是普通字符,会直接输出。比如,如果num是42,输出就是“ 42##”。 也有可能用户看到了某个例子中的格式字符串,其中%6d后面跟着##作为分隔符或其他用途。需要确认用户是否理解格式字符串中的普通字符和格式说明符的区别。 另外,需要检查是否有C语言的扩展或特定编译器支持##作为某种修饰符,但根据我的知识,标准C中没有这样的用法。可能的混淆点在于,用户可能将其他语言(如shell脚本或某些模板中的符号)与C语言混为一谈。 总结一下,%6d是正确的格式说明符,用于控制整数输出的宽度,而##只是普通的字符,会被原样输出。需要向用户明确这两部分的区别,避免混淆。同时,提醒用户如果在格式字符串中出现未预期的符号,应检查是否是多打了字符,或者是否有其他意图。</think>在C语言中,`%6d##` 包含两个需要拆解的部分: --- ### 1. **`%6d` 的作用** 这是C语言中 `printf` 函数的**格式说明符**,具体含义如下: - **`%`**:格式说明符的起始符号。 - **`6`**:字段宽度(field width),表示输出的整数**至少占据6个字符宽度**。 - 若实际数字位数**小于6**,会在左侧补空格(默认右对齐)。 - 若实际数字位数**大于6**,则按实际位数输出(不会截断)。 - **`d`**:表示输出的是一个十进制整数。 **示例:** ```c int num = 123; printf("%6d", num); // 输出:"   123"(左侧补3个空格,总宽度6) ``` --- ### 2. **`##` 的作用** `##` **不是格式说明符的一部分**!它会被直接当作普通字符输出,与格式无关。 **示例:** ```c int num = 123; printf("%6d##", num); // 输出:"   123##"(先按%6d格式输出,再追加两个#) ``` --- ### 完整解释 - `%6d##` = `%6d`(格式控制) + `##`(普通字符)。 - **执行逻辑**: 1. 先按 `%6d` 格式化输出整数(占6位宽度,右对齐)。 2. 紧接着输出两个 `#` 符号。 --- ### 对比其他类似格式 | 格式符 | 含义 | 示例(输入123) | |------------|-------------------------------|-----------------------| | `%d` | 默认宽度输出整数 | `123` | | `%6d` | 固定6字符宽度,右对齐 | `   123` | | `%-6d` | 固定6字符宽度,左对齐 | `123   ` | | `%06d` | 不足6位时左侧补0 | `000123` | | `%6d##` | 输出6位宽整数后追加两个`#` | `   123##` | --- ### 常见错误 - **误将 `##` 当作格式符**:`##` 只是普通字符,与格式控制无关。 - **混淆字段宽度与补零**:若需要补零,应使用 `%06d`,而非 `%6d`。 希望这个解释能帮助你理解!如果还有其他问题,欢迎继续提问~
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值