我試圖檢查符號鏈接是否存在於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
但是,這是行不通的。 如果'!'被排除在外,它從不觸發。而如果 '!'在那裏,它每次都會觸發。
我試圖檢查符號鏈接是否存在於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
但是,這是行不通的。 如果'!'被排除在外,它從不觸發。而如果 '!'在那裏,它每次都會觸發。
-L
如果「文件」存在並且是符號鏈接(鏈接的文件可能存在也可能不存在),則返回true。您需要-f
(如果文件存在並且是常規文件,則返回true)或者可能只是-e
(如果文件不管類型是否存在,則返回true)。
按照GNU manpage,-h
相同-L
,但根據BSD manpage,它不應該被用於:
-h file
真,如果文件存在且是一個符號鏈接。該操作員被保留以與該程序的先前版本兼容。不要依賴它的存在;用-L代替。
我正在查看符號鏈接是否不存在。 !-h或!-L應該適用於符號鏈接,!-e應該以其他方式工作。 – bear 2011-04-23 21:32:27
爲了幫助那些像我一樣通過Google找到它的人,使用'!'的完整語法是'if! [-L $ mda];然後...... fi'即將感嘆號放在方括號外。 – Sam 2012-09-05 08:06:48
只是想給@Sam給出的提示添加一些內容;當做這些操作時,請確保將文件名放在引號中,以防止空白問題。 例如'如果[! -L「$ mda」];然後... fi'(注意:'如果[!...]'和'if![...]'相同:) – 2013-08-06 12:26:10
該文件是否真的是符號鏈接?如果不是,通常存在的測試是-r
或-e
。
參見man test
。
也許這就是你要找的。檢查文件是否存在並且不是鏈接。
試試這個命令:
file="/usr/mda"
[ -f $file ] && [ ! -L $file ] && echo "$file exists and is not a symlink"
-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
如果符號鏈接存在但其目標不存在,'-e「$ {file}」'失敗。 – Flimm 2012-05-31 11:17:52
與Flimm相同的結果。我在OS X上。對我而言,-L和-h適用於符號鏈接,但不適用於-e或-f。 – pauljm 2014-04-14 20:43:04
@Flimm,所以如果我只想測試一個文件名是否被採用(不管是否存在目標文件或符號鏈接),最好的方法是什麼?顯然-e不行 – dragonxlwang 2016-02-28 20:34:22
您可以檢查一個符號鏈接的存在,它不與破:
[ -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
有關使用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
爲什麼它的價值,如果你使用[[! - D $ mda]]工作得很好.. – DMin 2017-12-13 06:55:01