2015-03-03 99 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 ;;