关于grep "*"、$mfile/*及指定脚本行作用的技术咨询
问题解答
让我一步步帮你拆解这些Shell相关的问题:
一、grep "*" 命令的作用
这里的关键是*被引号包裹了——在Shell中,引号会阻止通配符展开,所以grep "*"会把*当作字面意义上的星号字符来匹配,而不是正则表达式里表示“零个或多个前导字符”的量词。
具体到命令grep "*" /tmp/dirip.$$,它的作用是:在临时文件/tmp/dirip.$$中($$是当前Shell进程的ID,这个文件名能保证临时文件的唯一性),查找所有包含*字符的行。
如果没加引号直接写grep *,Shell会先把*展开成当前目录下的所有文件名,这时候grep会把这些文件名当作匹配模式,完全偏离原本的意图,所以引号在这里很重要。
二、$mfile/* 表达式的作用
这是Shell的**路径通配展开(Globbing)**语法:
- 假设变量
mfile的值是一个合法的目录路径(比如/home/user/docs),那么$mfile/*会被Shell自动展开成该目录下所有非隐藏文件/子目录的完整路径。 - 如果
mfile是空值,或者对应的路径不是有效目录,这个表达式会保留原样(比如变成/*或*),后续使用时如果没有匹配的文件,可能会直接输出字符串本身,或者报错。
三、Shell脚本行作用分析
先把脚本完整列出来方便参考:
1. grep "*" /tmp/dirip.$$ 2. if [ $? -eq 1 ] 3. #grep命令无输出时返回1 4. then mfile=$mfile/* 5. fi
第1行的作用
执行grep "*" /tmp/dirip.$$命令,核心目的有两个:
- 检查临时文件
/tmp/dirip.$$中是否存在包含*的行; - 为后续的条件判断提供退出状态码:grep的退出码规则是:
- 找到匹配行 → 退出码
0 - 未找到匹配行 → 退出码
1 - 文件不存在/权限问题等错误 → 退出码
2
- 找到匹配行 → 退出码
第4行的作用
当第2行的条件成立(也就是grep未找到任何包含*的行,退出码为1)时,执行mfile=$mfile/*:
- 它把变量
mfile的原有值后面拼接上/*,然后重新赋值给mfile。 - 注意:这里的
*不会立刻被Shell展开(因为是在变量赋值语句中),只有后续使用$mfile且未用引号包裹时,Shell才会对其中的*进行通配展开。比如原来mfile是/tmp/mydir,执行后mfile变成/tmp/mydir/*,后续用echo $mfile会展开成该目录下的所有文件,用echo "$mfile"则会直接输出/tmp/mydir/*。
内容的提问来源于stack exchange,提问作者adixia duchannes
相关产品推荐
相关产品推荐

