Shell脚本以仅包含冒号的行结尾?
Posted
技术标签:
【中文标题】Shell脚本以仅包含冒号的行结尾?【英文标题】:Shell script ending with a line containing only a colon? 【发布时间】:2014-05-12 09:41:00 【问题描述】:我正在研究当前 Debian 7.4.0 wheezy 版本中 /etc/init.d/ 中的 System V 初始化脚本(但它也存在于其他以前的版本中)。在该文件夹中找到的几乎所有(来自现有服务)都以一个空行结尾,基本上只包含一个冒号 (:) 符号。甚至可以在那里找到用于编写您自己的初始化脚本的“骨架”模板文件也有这个。这是代码末尾的复制/粘贴:
esac
:
(那是case语句的结尾,然后是文件的结尾)
还有什么有趣的是没有exit 0或者exit $?调用,除非仅在 case 语句中的某些条件下,否则会调用它,所以看起来冒号似乎是它的一种替代品? 完整的骨架文件代码在这里:https://gist.github.com/ivankovacevic/9917139
那个冒号可能是什么,为什么?
【问题讨论】:
:
是一个内置函数,在 bash 中计算为 true
,所以我怀疑这是将 $?
重置为 0。
【参考方案1】:
冒号是一个语法元素,本质上什么都不做,但返回 true。它可以在任何可以使用命令的地方使用。
有时在 sh(1) 需要语句的地方需要它。例如,这给出了一个错误:
if [ "$a" = "" ] ; then
# comment out this part for now
# echo yes
else
echo no
fi
bash:意外标记 `else' 附近的语法错误
将注释替换为 : 使其生效:
if [ "$a" = "" ] ; then
# comment out this part for now
: echo yes
else
echo no
fi
很少需要在 shell 中显式使用“exit 0”;在没有exit语句的情况下,shell脚本以最后一个命令的状态退出,一个刚刚执行的shell脚本
/bin/false
将给出退出状态 1:
$ echo $?
1
结肠在很大程度上是一种黑魔法,我从实验中了解到我对它知之甚少。
【讨论】:
为什么不在脚本末尾调用 exit 0,而不是用一个 : ... 我同意@Ivan Kovacevic:通过明确退出值来提高可读性,所以当我需要脚本返回成功状态时,我总是写“exit 0”。也就是说,应该只当人们真正想要覆盖错误状态时使用'exit 0',因为错误状态返回是有原因的。 冒号有一个值得商榷的好处:它产生的退出状态为 0,而不必在exit
和 return
之间进行选择(如果可能执行脚本,则很有用 或来源;来自来源文件的exit
ing 不太可能是可取的,而来自脚本的return
ing 是错误的)。如今,为了这个目的,应该可以使用更易读的true
来代替陈旧的:
。
@chepner:这真是一个合理的案例!在我看来,您的评论可以作为对此的完整答案。【参考方案2】:
:
在 BASH 中返回 true 状态,只是替换单词 true
。我认为在系统初始化脚本末尾使用 :
与 exit 0
相比没有任何好处,除了保存字符或降低可读性。
正如 chepner 指出的那样,:
将确保在不退出 shell 的情况下获得真实状态(如果脚本是来源的)。
它也常用于在语句中使用!
代替逻辑否定。
if [[ $var ]]; then
:
else
echo no
fi
等同于:
if ! [[ $var ]]; then
echo no
fi
【讨论】:
如果可以(或必须)获取脚本,exit 0
将退出获取脚本的 shell,而不仅仅是脚本。以上是关于Shell脚本以仅包含冒号的行结尾?的主要内容,如果未能解决你的问题,请参考以下文章
shell脚本应用正则表达式grep,sed,awk,的应用