2015-11-23 94 views
2

在我的shell腳本中,我試圖檢查特定文件是否存在以及它是否具有讀取權限。Shell腳本檢查文件是否存在,並具有讀取權限

我的文件路徑中有空格。

我引用的文件路徑:

file='/my/path/with\ some\ \spaces/file.txt' 

這是檢查文件是否存在功能:

#Check if file exists and is readable 
checkIfFileExists() { 
    #Check if file exists 
    if ! [ -e $1 ]; then 
     error "$1 does not exists"; 
    fi 

    #Check if file permissions allow reading 
    if ! [ -r $1 ]; then 
     error "$1 does not allow reading, please set the file permissions"; 
    fi 
} 

在這裏,我的雙引號,以確保它得到的文件作爲一個參數:

checkIfFileExists "'$file'"; 

我收到一個錯誤從bash的說法:

[: too many arguments 

這使我認爲它不會把它作爲一個參數。

但是在我的自定義錯誤中,我確實得到了整個路徑,並且它說它不存在。

Error: '/my/path/with\ some\ \spaces/file.txt' does not exists 

雖然不存在的話,當我試圖用「貓$文件」讀它,我得到一個權限錯誤..

我究竟做錯了嗎?

+0

您也可以使用複合命令'[! -r「$ 1」] && some command ||其他命令'而不是完整'如果[..];那麼一些命令;其他命令; fi' - 但在任何情況下總是引用你的變量。 –

回答

2

,當你需要引用變量替換正確的方法是用雙引號:

if [ -e "$1" ]; then 

您需要類似的整個腳本中引用,調用者需要引用或轉義字符串 - 但不能同時。當你將它,使用其中的一個:

file='/my/path/with some spaces/file.txt' 
# or 
file=/my/path/with\ some\ spaces/file.txt 
# or 
file="/my/path/with some spaces/file.txt" 

然後用雙引號圍繞價值在把它作爲一個參數:

checkIfFileExists "$file" 

同樣,在你需要的變量的值是插入,使用雙引號。

要了解這些行情做一個快速的插圖,試試這個:

vnix$ printf '<<%s>>\n' "foo bar" "'baz quux'" '"ick poo"' \"ick poo\" ick\ poo 
<<foo bar>> 
<<'baz quux'>> 
<<"ick poo">> 
<<"ick>> 
<<poo">> 
<<ick poo>> 

此外,亦見When to wrap quotes around a shell variable?

+0

明白了,它是有道理的..它看起來像現在它需要它作爲一個整體..是否有一個原因爲什麼-e返回假,雖然文件存在?我知道它存在,並有不好的權限..如果我試圖打開它 - 它告訴我它可以因爲權限 –

+0

我認爲這是因爲逃跑\我有我的路徑..它可能是? –

+0

啊是的;或者引號*或*轉義空格,但不是兩者。我會更多地更新答案。 – tripleee

-1
if [[ -e $1 ]];then 
echo it exists 
else 
echo it doesnt 
fi 

if [[ -r $1 ]];then 
    echo readable 
else 
    echo not readable 
fi 
相關問題