2015-03-03 322 views
0

我已经写了一个Bash脚本,它为大学使用了个案和函数,但无论我在哪里移动脚本,她都说它们没有正确缩进。这个脚本示例的正确缩进是什么?正确缩进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上是否有网站或功能可以让我的代码自动缩进?

+0

谁是“她” ......? – arco444 2015-03-03 13:27:22

+2

这是我的老师 – paul 2015-03-03 13:30:55

回答

3

缩进完成到澄清您的代码。缩进通常用于循环,如果使用语句,函数定义可以很容易地看到哪些语句是该循环的一部分或是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... 
... 

注意如何使用在这里记录让你的菜单很容易看到和格式。

最后,您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将尝试该任务。

+0

那只猫“菜单怎么办?我怎样才能将多个子菜单转换成这种小格式?如果需要,我可以发布整个菜单代码的编辑。除了“A退出”以外,每个菜单中还有一个通配符选项。 – paul 2015-03-03 19:01:21

+0

它被称为* Here Document *,并且在我的答案中有一个链接来解释它的工作原理。您是否阅读了答案中的链接:http://bash.cyberciti.biz/guide/Here_documents。或者,你是否不明白这个例子。这里有一篇维基百科文章:http://en.wikipedia.org/wiki/Here_document#Unix_shells。进行Google搜索以获取更多信息。或者在StackOverflow中进行搜索以查看一些示例。 – 2015-03-04 03:06:00

+0

是的,我想我已经设法让它在我的菜单上正常工作。你当然提到它看起来更整洁,有没有证明它更快或者什么?我正在使用它在一个项目中,并进一步想证明我使用heredoc而不是回声 – paul 2015-03-04 21:11:38

2

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

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

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

我该怎么做呢?当然这只是一个偏好问题?这里关于heredocs的文档使用了无穷无尽的if和elses,在我看来,这比case菜单更加混乱。 http://tldp.org/LDP/abs/html/here-docs.html – paul 2015-03-03 13:36:00

+0

多个if/elses总是一个可怕的想法。我只是指用heredoc来代替你的回声。以示例编辑答案。 – 2015-03-03 13:43:29

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 
    ;; 
    [...] 
+0

回声呢?他们应该如何缩进? – paul 2015-03-03 13:36:28

+1

缩进应该明确一个命令属于哪个控制结构(即_执行时)。这并不重要,它是什么类型的命令。所以'echo'语句没有特殊的缩进,除非它们是例如一个'if'子句。 – 2015-03-03 13:44:06

0

虽然有对shell脚本没有具体的标准,通用的压痕惯例规定,关于控制的同一级别的命令应该得到相同的缩进,并命令这取决于从结果前一行的控件构造应该相对于该控件构造缩进。在控制结构结束的地方,压痕应该恢复为流控制结构的压痕。

因此,在您的特定示例中,缩进的echoread语句相对于围绕它们的命令没有很好的原因缩进,并且语句的主体应该缩进。

如果配置正确,大多数不错的编辑会自动为您做这些工作。

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陈述缩进了四个空格。

+1

如果我有像这样的许多回声样式菜单的脚本,但是,我怎样才能把它们全部变成这里的文件?我应该在上面发布完整的菜单吗? – paul 2015-03-03 19:08:12

+0

几乎没有。如果你真的不知道如何自己做,请发表一个单独的问题;但@ DavidW的回答已经显示了如何做到这一点。 – tripleee 2015-03-03 19:39:00

2

风格将永远是一个讨论。一个好的起点是Google's style guide,它也提供了许多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." 

当你有更多的菜单的,我会考虑使用TEXTFILES与菜单线和cat正确的菜单文件。你可以看到一个例子https://unix.stackexchange.com/questions/38200/ksh-styling-text-based-menu-using-stderr/115371#115371

+1

多年来,*标准*是在大多数编程语言中使用4个字符来标记8个字符和缩进。 (在VI中,它是'set sw = 4 ts = 8')。现在,通常使用空格而不是制表符,因为它可以确保每个人都以它应该的方式读取它(如果有人将制表符设置为4个字符,代码将会关闭)。在VIM中,您可以设置expandtab或set eb。您还可以用':retab'来展开已有文件中的选项卡。对我而言,仅有两个空格对我来说太少了,尤其是在Python中(但在XML中很常见)。 – 2015-03-04 03:10:01

0

只需用vim编辑器打开文件并输入gg = G就可以重新整理整个文件。

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