4

在 RHEL6 /etc/profile 的末尾有一个 if 语句:

if [ "${-#*i}" != "$-" ];

!=我猜是字符串比较运算符的“不等于” 。我猜左边是变量中的字符串-@*i,右边是里面的字符串$-(我认为这是传递给脚本的标志)。这是在 for 循环的中间, $i 应该存在,但我不知道-#*i可能是什么。

假设我是正确的,$-是传递给脚本的标志,我认为${-#*i}也必须是标志,但我真的不知道。

有人可以解释一下。与这些特殊变量列表的链接也将不胜感激。

提前致谢。

4

3 回答 3

4

在 bash 手册页中查找“${parameter#word}”。# 在左边的表达式中删除了模式“*i”,即“从开始到'i'”的$-内容。$- 包含当前 shell 的标志(请参阅 参考资料set)。

kjp 是正确的,它检查 shell 是否以交互模式运行(通过从字符串中删除可能的“i”标志进行比较)。Bash 的手册页说:

交互式 shell 是在没有非选项参数且没有 -c 选项的情况下启动的,其标准输入和错误都连接到终端(由 isatty(3) 确定),或者以 -i 选项启动。PS1 已设置并且 $- 包括 i 如果 bash 是交互式的,则允许 shell 脚本或启动文件测试此状态。

于 2012-07-18T15:56:33.447 回答
4

它正在检查当前 shell 是否是交互式 shell。

-i变量中的存在$-(包含传递给 shell 的标志列表)是检查交互式与非交互式 shell 的一种方法。有关内部 shell 变量的列表,请参见此处,包括$-

于 2012-07-18T16:02:05.517 回答
2

我不知道$-变量是什么,但上面的代码基本上是测试是否$-包含一个i.

在 bash${var#pattern}中意味着删除$var了最小的匹配项。pattern如果pattern未找到,则$var原样返回。

所以在你的例子中,如果$-fish。那么${-#*i}将是sh. 所以 if 语句是真的(因为sh!= fish)。

给你的链接:

bash 中的变量扩展:http ://www.gnu.org/software/bash/manual/bashref.html#Shell-Parameter-Expansion

Bash 定义的变量:http ://www.gnu.org/software/bash/manual/bashref.html#Shell-Variables

于 2012-07-18T15:57:18.893 回答