Bash 脚本的正确缩进

Proper indentation of Bash script

我写了一个 Bash 脚本,它使用大学案例和函数,但无论我将脚本移动到哪里,她都说它们没有正确缩进。此脚本示例的正确缩进是什么?

clear
      echo "Start A Process"
echo "*************************"
echo "1. Oxygen Level."
echo "***************************"
echo "2. Temperature ."
echo "*************************"
echo "3. Mars Rover Speed."
echo "*************************"
echo "4. Satellite Distance"
echo "*************************"
echo "5. Carbon Dioxide Level"
echo "*************************"
echo "6. Humidity %."
echo "*************************"
echo "Press A to quit."
echo "*************************"
    read -p "Please make a choice:" choice2

#Choices
case "$choice2" in

1)
$script/simulate start oxygen
echo "Oxygen Level Started."
sleep 5
;;
2)

VMware 上是否有网站或功能可以让我的代码自动缩进?

正确的缩进取决于所需的样式,这纯属见仁见智。换句话说,唯一能回答你问题的人就是你所说的神秘女子"she"。就个人而言,我会说你有比缩进更大的问题。与其从标准输入中读取选择,不如将其作为命令行参数。不要总是打印显示选项的菜单,您应该只打印它们以响应 -h 或 --help 或类似的东西。与其使用一串连续的回显,不如使用单个 heredoc 来打印菜单。例如:

usage() {  cat <<- EOF
    $(basename [=10=]) option

    Start A Process, where option is one of:
    1) oxygen level
    ...
    6) Humidity %.      
EOF
}

此问题已在 Unix Stack Exchange 上得到处理。

没有 Bash 的标准。通常你至少缩进每一级:

  • 函数
  • 循环(forwhile
  • 条件 (if, case)

一些例子:

function echofoo() {
  echo foo
}

if true
then
  echo foo
else
  echo bar
fi

case "$choice" in
  1)
    echo foo
  ;;
  2)
    echo bar
  ;;
    [...]

虽然没有针对 shell 脚本的特定标准,但通用缩进约定规定同一控制级别上的命令应接收相同的缩进,而取决于控制构造结果的命令前一行应该相对于该控制结构缩进。在控制构造结束的地方,缩进应恢复为流控制构造的缩进。

因此,在您的特定示例中,缩进的 echoread 语句相对于围绕它们的命令以及 case 语句的主体没有充分的理由缩进应该缩进。

如果配置得当,大多数体面的编辑器或多或少会自动为您执行此操作。

clear
# Really, really recommend turning this into a here document
echo "Start A Process"
echo "*************************"
echo "1. Oxygen Level."
echo "***************************"
echo "2. Temperature ."
echo "*************************"
echo "3. Mars Rover Speed."
echo "*************************"
echo "4. Satellite Distance"
echo "*************************"
echo "5. Carbon Dioxide Level"
echo "*************************"
echo "6. Humidity %."
echo "*************************"
echo "Press A to quit."
echo "*************************"
read -p "Please make a choice:" choice2

#Choices
case "$choice2" in
 1)
    $script/simulate start oxygen
    echo "Oxygen Level Started."
    sleep 5
    ;;
 2)

case 语句中缩进的细节不那么严格。有些人将个别案例标签缩进到与管理 case 相同的级别,其他人将它们缩进一个完整级别(这里是四个空格)。我倾向于选择一个中间立场,这样案例的主体就正好是相对于管理 case 语句缩进的四个空格。

缩进是为了阐明您的代码。缩进通常用于循环、if 语句、函数定义,以便于查看哪些语句是该循环的一部分或 if 语句的一部分。

使代码更具可读性的另一个技巧是添加空行以分隔相关代码块。例如,用几行空行将 menu 与其余代码分开:

clear
echo "Start A Process"

echo "*************************"
echo "1. Oxygen Level."
echo "***************************"
echo "2. Temperature ."
echo ....   #And on and on...
echo "*************************"
echo "6. Humidity %."
echo "*************************"
echo "Press A to quit."
echo "*************************"

read -p "Please make a choice:" choice2

case "$choice2" in...
...

这样可以更轻松地查看您正在显示的菜单。您还可以使用 Here document 来消除使菜单难以看清的重复回声和引号。我会消除那些过于花哨的东西,比如星号线。他们没有向程序添加任何内容,只是让它更难阅读 - 无论是代码还是执行:

clear

cat <<MENU
START A PROCESS
------------------
1. Oxygen Level.
2. Temperature .
3. Mars Rover Speed.
4. Satellite Distance
5. Carbon Dioxide Level
6. Humidity %.
A. Quit
------------------
MENU

read -p "Please make a choice:" choice2

case "$choice2" in...
...

请注意如何使用此处的文档 使您的菜单易于查看和格式化。

最后,您的 case 语句应遵循保持公共行缩进的缩进规则,因此您不仅知道 case 语句附带的代码,而且还缩进了每个选择:

case "$choice2" in
    1)
        $script/simulate start oxygen
        echo "Oxygen Level Started."
        sleep 5
        ;;
    2)
       .....
       .....
       ;;
   .....
esac

有些人会稍微压缩一下:

case "$choice2" in
    1)  $script/simulate start oxygen
        echo "Oxygen Level Started."
        sleep 5;;
    2)  .....
        .....;;
   .....
esac

缩进几乎相同。合并几行以使 case 更紧凑且更易于阅读。

为了帮助您进行缩进和编码,请使用程序编辑器而不仅仅是文本编辑器。像 VIM 这样好的程序编辑器会自动缩进您的代码,甚至突出显示语法,使其更易于阅读。 Eclipse 用于 Java 编程,但可用作 shell 脚本的文本编辑器。一个好的编辑器还可以通过向您显示该命令的联机帮助页来帮助您了解使用某些语句命令的方式。当您在 VIM 中按大写字母 K 时,它会显示该命令的联机帮助页。

Bash 程序美化 相当棘手。但是,有一个 Python program 会尝试该任务。

风格永远是一个话题。 Google's style guide 是一个很好的起点,它还提供了很多 shell 结构的概述。

我碰巧不同意 Google 的风格 "Indent 2 spaces. No tabs.",我更喜欢标签。一些开发人员喜欢看到 2 个空格,有的喜欢 4 个,您可以按自己喜欢的方式更改它(vi: set tabstop=3 indent=3)。

如何显示菜单? 你可以像这样使用一个回声:

   echo "Start A Process
       1. Oxygen Level.
       2. Temperature .
       3. Mars Rover Speed.
       4. Satellite Distance
       5. Carbon Dioxide Level
       6. Humidity %.

       Press A to quit."

当您有更多菜单时,我会考虑使用带有菜单行的文本文件和 cat 正确的菜单文件。您可以在 https://unix.stackexchange.com/questions/38200/ksh-styling-text-based-menu-using-stderr/115371#115371

查看示例

只需使用 vim 编辑器打开文件并输入 gg=G 即可重新缩进整个文件。

我找到了这个答案 here:

Emacs 可以做到这一点:

  • 将文件载入 Emacs
  • 按文件顶部的Ctrl-space
  • 将光标移动到文件底部
  • Alt-x并输入untabify然后return
  • Alt-x并输入indent-region然后return

这将摆脱制表符并正确缩进所有内容。

如果您需要更频繁地执行此操作并且不使用 Emacs 作为您的编辑器,您可能希望将其全部打包到一个脚本中:

#!/usr/bin/emacs --script

(setq require-final-newline 'visit)

(defun indent-files (files)
  (cond (files
         (find-file (car files))
         (untabify (point-min) (point-max))
         (indent-region (point-min) (point-max))
         (save-buffer)
         (kill-buffer)
         (indent-files (cdr files)))))

(indent-files command-line-args-left)

;; EOF ;;

What is the correct indentation of this sample of the script?

有none个。缩进是个人喜好的问题。如果 she 建议 您的 代码缩进不正确,您要么错过了要求,要么应该更新说明以说明需要使用正确的缩进。

Is there a website or a function on VMware where I can get my code automatically indented?

无需自动缩进。只需按 spacetab 键缩进您复制的代码。