Linux Bash脚本的正确缩进

Linux Bash脚本的正确缩进,linux,bash,ubuntu-12.04,indentation,Linux,Bash,Ubuntu 12.04,Indentation,我已经写了一个Bash脚本,它使用了大学的案例和函数,但是不管我把脚本移到哪里,她说它们没有正确缩进。这个脚本示例的正确缩进是什么 clear echo "Start A Process" echo "*************************" echo "1. Oxygen Level." echo "***************************" echo "2. Temperature ." echo "*************************"

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

正确的缩进取决于所需的样式,这纯粹是一个意见问题。换句话说,唯一能回答你问题的人就是你称之为“她”的神秘女人。就我个人而言,我会说你有比缩进更大的问题。与其从stdin读取选择,不如将其作为命令行参数。您不应该总是打印显示选项的菜单,而应该只在响应-h或--help或类似命令时打印它们。不要使用一串连续的回声,而是使用一个单独的heredoc来打印菜单。例如:

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

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

usage(){cat这个问题已经在上讨论过了

Bash没有标准。通常,您至少缩进以下每一级:

  • 功能
  • 循环(
    用于
  • 条件句(
    if
    case
一些例子:

function echofoo() {
  echo foo
}


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

因此,在您的特定示例中,缩进的
echo
read
语句相对于围绕它们的命令缩进是没有充分理由的,并且
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语句、函数定义,以便于查看哪些语句是该循环的一部分或函数的一部分e如果语句

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

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...
...
这样可以更容易地看到您正在呈现的菜单。您还可以使用a消除使菜单难以看到的重复回音和引号。我会消除一些过于花哨的东西,如星号行。它们不会向程序添加任何内容,只会使程序更难阅读-无论是在代码方面还是在执行方面:

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 "$choice2" in
    1)  $script/simulate start oxygen
        echo "Oxygen Level Started."
        sleep 5;;
    2)  .....
        .....;;
   .....
esac
缩进基本相同。将几行代码组合在一起,使
的大小写更紧凑,更易于阅读

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


Bash程序的美化是相当棘手的。但是,有一种方法将尝试这项任务。

风格将始终是一个讨论的话题。一个很好的起点是它还提供了许多shell构造的概述

我不同意谷歌风格的“缩进2个空格,没有制表符”。我更喜欢制表符。有些开发人员喜欢看到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."

<> P>当你有更多的菜单时,我会考虑使用菜单行的文本文件和<代码> CAT<代码>正确的菜单文件。你可以在

< p>中看到一个例子:用VIM编辑器打开文件并键入GG= G将整个文件缩进。

< P>我找到了这个答案:

Emacs可以做到这一点:

  • 将文件加载到Emacs中
  • 按文件顶部的
    Ctrl空格
  • 将光标移动到文件的底部
  • Alt-x
    并键入
    untabify
    ,然后返回
  • Alt-x
    并键入
    缩进区域
    ,然后返回
这将消除制表符并正确缩进所有内容

如果需要更频繁地执行此操作,并且不使用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 ;;
这个脚本示例的正确缩进是什么

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


无需自动缩进。只需按空格键或制表键缩进您复制的代码。

我如何才能做到整洁?当然这只是一个偏好问题?heredocs上的文档使用无休止的ifs和ELSE,在我看来比
   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."
#!/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 ;;