2011-11-07 89 views
1

我殼牌使這個小程序:Shell:目錄中的/和//之間有區別嗎?

#*************************************************************** 
# Function. 
# NAME: chk_df 
# Synopsis: 
# Check if a local directory (dirName) exist and has a file (fileName). 
# 
# 
# The return codes are the following: 
# 99 : dirName does not exists 
# 0 : dirName exists and has fileName 
# 1 : dirName exists and has not fileName 
# 
# Parameters: 
# In values: dirName <string> fileName <string> 
# Out values: returnCode <int> 
# 
# How to use: 
# chk_df dirName fileName 
#*************************************************************** 
chk_df(){ 
    # Check the number of arguments that could be passed. 
    # In this case, two, dirName, fileNAme. 
    if [[ ${#@} != 2 ]]; then 
     echo "Error ...Use [Function]: chk_df <dirName> <fileName>" 
     echo "Ex: chk_df /foo lola.txt" 
     exit 
    fi 

    DIR=$1 
    FILE=$2  

    [[ ! -d $DIR ]] && return 99 
    [[ -d $DIR && ! -e $DIR/$FILE ]] && return 1 
    [[ -d $DIR && -e $DIR/$FILE ]] && return 0 

} 

因爲我需要檢查文件是否在目錄中,我這樣做(可怕?)補丁$ DIR/$ FILE,但事情像這樣可能發生:

I) If we do: chk_df /foo lola.txt 
We get: /foo/lola.txt 

II) If we do: chk_df /foo/ lola.txt 
We get: /foo//lola.txt [Notice the //] 

在這兩種情況下代碼似乎工作。 爲什麼?我讀到反斜槓的行爲像空間。所以,我可以把n反斜槓沒有未知的問題?

我可以這樣嗎?否則會帶來問題?有區別嗎? UNIX以正確的方式假設它?

額外問題:爲什麼我不能用負數做回報?這是:return -1

+0

後多餘的問題seperately在'unix.stackexchange.com' –

+0

謝謝,我在一個wiki中讀到這個答案:'Unix退出狀態被限制在值0-255,無符號8位整數的範圍內。只詢問是否有辦法繞過這一點。我會寫在另一個問題。 – Kani

+0

http://unix.stackexchange.com/questions/12283/unix-difference-between-path-starting-with-and/12291#12291 –

回答

6

///,或連續的斜線任何字符串具有根據POSIX標準相同的含義,不同之處在於它們可以具有在路徑的開始處的不同的含義(因此/foo//foo可表示不同對象)。 Linux不使用這個例外,因此任何數量的連續斜線總是意味着與單個/相同的事物。

(唯一的例外是有迎合使用導致//表示網絡路徑的其他類Unix系統的需求。)

+0

謝謝。你會推薦我用代碼保證只放一個'/'來清理代碼。這是:如果我有兩個或更多個連續的'/',只用一個'/'替換它?在你看來,這是必要的嗎? – Kani

+0

@Kani:使用單斜線稍微安全一些,因爲你不太可能碰到PATH_MAX。如果你輸出用戶消費路徑或當你將它們存儲在某個地方,它也更好。這通常不是必要的,所以請自己決定。 –

+0

從[Unix.stackexchange.com](http://unix.stackexchange。com/questions/12283/unix-difference-between-path-starting-with-and/12291#12291) –

1

沒有區別。

// =/

0

可以,原則上,只要你想(直到你開始打PATH_MAX或一些其他硬限制)使用盡可能多的/分隔符:

$ ls /usr/bin///////////////less 
/usr/bin///////////////less 

一個問題你」如果你想測試兩條路徑是相同的[*],因爲/ usr/bin/less和/ usr/bin // less是相同的路徑,但是是不同的字符串。在比較之前對路徑進行canonicalise可能很有用。

[*]忽略不同路徑可引用同一對象的事實。

相關問題