2011-04-23 87 views
137

我試圖檢查符號鏈接是否存在於bash中。這是我嘗試過的。如何檢查符號鏈接是否存在

mda=/usr/mda 
if [ ! -L $mda ]; then 
    echo "=> File doesn't exist" 
fi 


mda='/usr/mda' 
if [ ! -L $mda ]; then 
    echo "=> File doesn't exist" 
fi 

但是,這是行不通的。 如果'!'被排除在外,它從不觸發。而如果 '!'在那裏,它每次都會觸發。

+1

爲什麼它的價值,如果你使用[[! - D $ mda]]工作得很好.. – DMin 2017-12-13 06:55:01

回答

219

-L如果「文件」存在並且是符號鏈接(鏈接的文件可能存在也可能不存在),則返回true。您需要-f(如果文件存在並且是常規文件,則返回true)或者可能只是-e(如果文件不管類型是否存在,則返回true)。

按照GNU manpage-h相同-L,但根據BSD manpage,它不應該被用於:

-h file真,如果文件存在且是一個符號鏈接。該操作員被保留以與該程序的先前版本兼容。不要依賴它的存在;用-L代替。

+2

我正在查看符號鏈接是否不存在。 !-h或!-L應該適用於符號鏈接,!-e應該以其他方式工作。 – bear 2011-04-23 21:32:27

+30

爲了幫助那些像我一樣通過Google找到它的人,使用'!'的完整語法是'if! [-L $ mda];然後...... fi'即將感嘆號放在方括號外。 – Sam 2012-09-05 08:06:48

+13

只是想給@Sam給出的提示添加一些內容;當做這些操作時,請確保將文件名放在引號中,以防止空白問題。 例如'如果[! -L「$ mda」];然後... fi'(注意:'如果[!...]'和'if![...]'相同:) – 2013-08-06 12:26:10

1

如果您正在測試文件存在,則需要-e不是-L。 -L測試符號鏈接。

+0

我正在查看符號鏈接是否不存在。 !-h或!-L應該適用於符號鏈接,!-e應該以其他方式工作。 – bear 2011-04-23 21:32:08

+3

你想要什麼不清楚。該文件存在並不是符號鏈接?然後測試* -e和!-h。 – 2011-04-23 21:40:09

+0

文件位是一個錯誤,它是一個符號鏈接,而不是文件本身。 – bear 2011-04-23 21:41:41

3

該文件是否真的是符號鏈接?如果不是,通常存在的測試是-r-e

參見man test

13

也許這就是你要找的。檢查文件是否存在並且不是鏈接。

試試這個命令:

file="/usr/mda" 
[ -f $file ] && [ ! -L $file ] && echo "$file exists and is not a symlink" 
31

-L是測試的文件存在,並且是符號鏈接

如果你不想來測試該文件是一個符號鏈接,但只是測試,看看它是否存在無論類型(文件,目錄,套接字等),然後使用-e

因此,如果文件是真正的文件,而不僅僅是一個符號鏈接,你可以做所有這些測試和 得到一個退出狀態,其值指示錯誤狀態。

if [ ! \(-e "${file}" \) ] 
then 
    echo "%ERROR: file ${file} does not exist!" >&2 
    exit 1 
elif [ ! \(-f "${file}" \) ] 
then 
    echo "%ERROR: ${file} is not a file!" >&2 
    exit 2 
elif [ ! \(-r "${file}" \) ] 
then 
    echo "%ERROR: file ${file} is not readable!" >&2 
    exit 3 
elif [ ! \(-s "${file}" \) ] 
then 
    echo "%ERROR: file ${file} is empty!" >&2 
    exit 4 
fi 
+9

如果符號鏈接存在但其目標不存在,'-e「$ {file}」'失敗。 – Flimm 2012-05-31 11:17:52

+0

與Flimm相同的結果。我在OS X上。對我而言,-L和-h適用於符號鏈接,但不適用於-e或-f。 – pauljm 2014-04-14 20:43:04

+0

@Flimm,所以如果我只想測試一個文件名是否被採用(不管是否存在目標文件或符號鏈接),最好的方法是什麼?顯然-e不行 – dragonxlwang 2016-02-28 20:34:22

12

您可以檢查一個符號鏈接的存在,它不與破:

[ -L ${my_link} ] && [ -e ${my_link} ] 

所以,完整的解決方案是:

if [ -L ${my_link} ] ; then 
    if [ -e ${my_link} ] ; then 
     echo "Good link" 
    else 
     echo "Broken link" 
    fi 
elif [ -e ${my_link} ] ; then 
    echo "Not a link" 
else 
    echo "Missing" 
fi 
3

有關使用readlink如何?

# if symlink, readlink returns not empty string (the symlink target) 
# if string is not empty, test exits w/ 0 (normal) 
# 
# if non symlink, readlink returns empty string 
# if string is empty, test exits w/ 1 (error) 
simlink?() { 
    test "$(readlink "${1}")"; 
} 

FILE=/usr/mda 

if simlink? "${FILE}"; then 
    echo $FILE is a symlink 
else 
    echo $FILE is not a symlink 
fi 
相關問題