在我的Oracle linux中,我在/etc/profile中发现了一个很难理解的脚本块:
for i in /etc/profile.d/*.sh ; do if [ -r "$i" ]; then if [ "${-#*i}" != "$-" ]; then . "$i" else . "$i" >/dev/null 2>&1 fi fi done
我的问题是if语句${-#*i}和$-的variables。 那是什么意思? 为什么要添加一个else语句来redirect输出? 谢谢!
在arraysbash中存储grep输出
linux:定时执行命令,将stout和sterr都redirect到日志文件并显示在terminal中
为什么卸载Apache2尝试安装PHP5-CGI?
grep / Sed之间的两个标签与多行
首选的terminal脚本语言
$-是一个存储shell设置的当前选项的变量 。
${-#*i}正在使用子字符串移除来从变量的开头移除与模式*i最短的匹配。 所以如果$-具有值abcifOO那么${-#*i}将是fOO 。 (你可以在这里阅读更多关于bash子串的信息。)
这意味着测试
[ "${-#*i}" != "$-" ]
如果变量$-包含选项i ,则表示交互模式打开。
所有这一切意味着只有在交互模式下,输出才会被重定向到/dev/null 。
这是检查外壳是否交互。 当前shell的选项在$-如果删除任何后面i产生不同的结果,这意味着i是旗之一。
不过这将会更具可读性和惯用性:
case $- in *i* ) ... ;; esac
而且,在循环之外进行一次检查会更好。
$-是什么意思?
从手册:
-
(连字符)根据调用,set builtin命令或shell自身设置的选项(例如-i选项)扩展为当前选项标志。
当你以交互方式运行bash , $-可能会扩展到如下所示:
himBH
当你执行脚本时, $-不会有i (除了上面的其他标志)。
${-#*i}是什么意思?
说${-#*i}导致从$-的扩展开始*i的最短匹配被删除。 (请参阅外壳参数扩展 。)
简而言之, if在示例中有条件,则内部意味着在交互模式下执行以下内容:
. "$i" >/dev/null 2>&1
而在非交互模式下,如下:
. "$i"
只是加起来有关$ – 的更多细节。 如果你尝试输入你的终端
[root@zee ~]# echo $- himBH
这些似乎是壳'设置'值
来自info bash --index-search=set片段info bash --index-search=set
'-h'
找到并记住(散列)命令,因为它们被查找执行。 该选项默认启用。
'-m'
作业控制已启用(*注意作业控制::)。
'-B'
shell将执行大括号扩展(* note Brace Expansion::)。 这个选项默认是打开的。
'-H'
启用“!” 样式历史替换(*注意历史交互:)。 对于交互式shell,这个选项默认是打开的。
使用+' rather than – 会导致这些选项被关闭。 这些选项也可以在调用shell时使用。
总结以上是内存溢出为你收集整理的if 是什么意思?全部内容,希望文章能够帮你解决if 是什么意思?所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)