2011-09-21 96 views
72

我有一個shell腳本,它包含以下內容:在shell腳本行末尾多餘的分號?

case $1 in 
    0) 
    echo $1 = 0; 
    OUTPUT=3;; 
    1) 
    echo $1 = 1; 
    OUTPUT=4;; 
    2) 
    echo $1 = 2; 
    OUTPUT=4;; 
esac 

HID=$2; 
BUNCH=16; 
LR=.008; 

分號完全是多餘的在上面的代碼片段?有人使用雙分號有什麼理由嗎?

看起來分號只是一個分隔符,你可以用它來代替新行。

回答

105

行尾的單分號是多餘的,因爲換行符也是一個命令分隔符。 case特別需要在每個模式塊的最後一個命令結束時使用雙分號;詳情請參閱help case

+9

太棒了! 因此,如果我理解正確,我可以安全地刪除任何行末尾的任何單個分號,但不會加上兩個分號? – Nagel

+5

這是正確的。 –

22

根據man bash

metacharacter 
     A character that, when unquoted, separates words. One of the following: 
     | & ; () < > space tab 
    control operator 
     A token that performs a control function. It is one of the following symbols: 
     || & && ; ;; () | |& <newline> 

所以,;可以是元字符或控制操作員,而;;始終是一個控制操作員(在情況下命令)。

在您的特定代碼中,不需要在行末尾的所有;。但是需要;;

4

在find的特例中,用於終止由-exec調用的命令。請參閱@kenorb對此的回答question

1

@Ignacio巴斯克斯 - 艾布拉姆斯

其實這不完全是在一行的末尾準確,單分號多餘的,是絕對不一樣的東西如新線。

從由分離的Bash Reference Manual

命令以「;」順序地執行; shell會等待每個命令依次終止 。返回狀態是執行的最後一個命令的退出狀態 。

命令由「新行」 可能會並行執行時由分號分隔的命令是總是 @ Opensourcebook-阿米特依次

+4

這是錯誤的。沒有區別。如果你正確地閱讀了本手冊的相同部分,你會看到這一點,只是上面幾行:'一個或多個換行符的序列可能出現在列表中以分隔命令,相當於一個分號。「所以你引用了什麼關於分號同樣適用於換行符。 –

+1

我同意這句話含糊不清,我認爲作者的意思是說「;」和「\ n」都可以多次使用來分隔命令,但不是它們正在做同樣的事情。 我發現此鏈接:http://unix.stackexchange.com/questions/53390/is-there-a-way-to-run-process-parallelly-in-the-loop-of-a-bash-script 我也沒有知道這之前,我真的有一個問題,我寫了一些腳本,並注意到「;」之間的區別。和「\ n」由我的一位同事。 不幸的是,這是很久以前的事了,我不記得在這裏發表一個例子是什麼。 –

+2

如果您要閱讀鏈接到@IJ的文章,您會發現並行性來自'&'而不是'\ n'。在評論中聲明他可以跳過分號,因爲顯然,'&'也是一個命令分隔符,就像';'和'\ n'。 – Matthias

0

執行

換行符相當於分離在終端或shell腳本中使用單分號(;)。

參見下面的實施例:

在termainal: [根@服務器測試]#LS; PWD;


在shell腳本:

[根@服務器測試]#貓test4.sh

回聲 「當前用戶名:」 WHOAMI

回聲-e「\ n當前日期: 「;日期;

[根@服務器測試]#

但我不評論同意&相當於換行或單分號

&是在後臺運行也是一個命令分隔的命令,但不能擔任分號或換行符。