适当缩进Bash脚本

时间:2015-03-03 13:21:08

标签: linux bash ubuntu-12.04 indentation

我编写了一个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上是否有网站或功能可以让我的代码自动缩进?

9 个答案:

答案 0 :(得分:5)

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

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

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...
...

请注意如何使用 here document 使您的菜单易于查看和格式化。

最后,您的case语句应遵循缩进规则,保持公共行缩进,这样您不仅可以知道case语句的代码,还可以缩进每个选项:< / p>

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将尝试执行该任务。

答案 1 :(得分:2)

正确的缩进取决于所需的样式,这纯粹是一种观点问题。换句话说,唯一可以回答你问题的人是你所指的神秘女人,她是#34;。就个人而言,我会说你有比压痕更大的问题。您不应该从stdin中读取选择,而应该将其作为命令行参数。而不是总是打印显示选项的菜单,您应该只打印它们以响应-h或--help或类似的东西。使用单个heredoc打印菜单,而不是使用一串连续的回声。例如:

usage() {  cat <<- EOF
    $(basename $0) option

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

答案 2 :(得分:2)

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

我碰巧不同意谷歌风格&#34;缩进2个空格。没有标签。&#34;,我更喜欢标签。一些开发人员喜欢看2个空格,大约4个,你可以按你喜欢的方式改变它(vi:set tabstop = 3 indent = 3)。

如何显示菜单? 您可以像这样使用ONE echo:

   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

查看示例

答案 3 :(得分:1)

此问题已在Unix Stack Exchange处理过。

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

  • 功能
  • 循环(forwhile
  • 条件(ifcase

一些例子:

function echofoo() {
  echo foo
}

if true
then
  echo foo
else
  echo bar
fi

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

答案 4 :(得分:0)

虽然没有针对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陈述缩进的四个空格。

答案 5 :(得分:0)

只需使用vim编辑器打开文件,输入gg = G就会重新整理整个文件。

答案 6 :(得分:0)

我找到了这个答案here

Emacs可以做到这一点:

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

这将删除标签并正确缩进所有内容。

如果您需要更频繁地执行此操作并且不使用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 ;;

答案 7 :(得分:0)

派对有点晚了,但看起来shfmt可以帮你解决问题。它格式化shell / bash代码,包括缩进。

shfmt -l -w script.sh

答案 8 :(得分:0)

  

此脚本示例的正确缩进是什么?

没有。缩进是个人喜好问题。如果提示您的代码没有正确缩进,则您错过了一项要求,或者应该更新说明以声明需要使用正确的缩进。

  

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

无需自动执行缩进。只需按空格 tab 键以缩进所复制的代码。