在这里做了什么[“$ { - #* i}”!=“$ - ”]

时间:2012-07-18 15:50:14

标签: bash

在RHEL6 / etc / profile附近,有一个if语句:

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

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

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

有人可以解释一下。与这些特殊变量列表的链接也将受到赞赏。

提前致谢。

3 个答案:

答案 0 :(得分:4)

在bash联机帮助页中查找“$ {parameter#word}”。左表达式中的#删除了$ *的内容“从*开始到'i'”的模式“* i”。 $ - 包含当前shell的标志(参见set)。

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

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

答案 1 :(得分:4)

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

-i变量中存在$-(包含传递给shell的标志列表)是one way of checking for interactive vs non-interactive shell。有关内部shell变量的列表,请参阅here,包括$-

答案 2 :(得分:2)

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

在bash ${var#pattern}中,$var表示删除了最小匹配pattern的{​​{1}}。如果未找到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