在RHEL6 / etc / profile附近,有一个if语句:
if [ "${-#*i}" != "$-" ];
我猜测!=
是字符串比较运算符的“不相等”。我猜的左边是变量-@*i
中的字符串,右边是$-
中的字符串(我认为是传递给脚本的标志)。这是在for循环的中间,$ i应该存在但是我不知道-#*i
可能是什么。
假设我正确$-
是传递给脚本的标志,我认为${-#*i}
也必须是标志,但我真的没有线索。
有人可以解释一下。与这些特殊变量列表的链接也将受到赞赏。
提前致谢。
答案 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