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,而不必在 exitreturn 之间进行选择(如果可能执行脚本,则很有用 来源;来自来源文件的exiting 不太可能是可取的,而来自脚本的returning 是错误的)。如今,为了这个目的,应该可以使用更易读的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,的应用

shell脚本应用正则表达式grep,sed,awk,的应用

35 shell脚本

shell脚本结构date命令变量

2018-10-25

学习六十三