在我的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”读取它时,我收到了一个权限错误..
我做错了什么?
答案 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>>
答案 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