Shell脚本检查文件是否存在,并具有读取权限

时间:2015-11-23 08:31:11

标签: bash 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

虽然它确实存在,当我尝试用“cat $ file”读取它时,我收到了一个权限错误..

我做错了什么?

2 个答案:

答案 0 :(得分: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?

答案 1 :(得分:-1)

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

if [[ -r $1 ]];then
  echo readable
else
  echo not readable
fi