单引号文件路径测试失败

Test failed on single quoted file path

我写了一个 bash 脚本,要求用户输入完整路径的文件:

printf ' Please type the path of ISO file:\n'
read -p ' ' berkas

if [[ -f $berkas ]]
then
    printf " $berkas found\n"
else    
    printf " Could not find $berkas\n"
fi

但如果文件路径是单引号则失败(例如,如果我将文件从 Nautilus window 拖到脚本 windows):

 Please type the path of ISO file:
 '/home/iza/Software/Windows/ISO/Windows7_Ultimate_x64_SP1.iso'
 Could not find '/home/iza/Software/Windows/ISO/Windows7_Ultimate_x64_SP1.iso'

代码有什么问题?如果解决方法不涉及 sed 或 awk,我会很高兴。

谢谢 :)

您可以使用以下方法删除 bash 中变量开头和结尾的引号:

berkas=${berkas%\'} # remove single quote from end of variable if it exists
berkas=${berkas#\'} # remove single quote from start of variable if it exists

如果没有引号,则不会删除任何内容。

通常认为在变量周围加上双引号是好的做法,例如
[[ -f "$berkas" ]]

此外,您可以只使用 echo:

而不是使用 printf 并手动附加 \n 换行符
echo ' Please type the path of ISO file:'
read -r -p ' ' berkas

if [[ "$berkas" = \'*\' ]]; then
    berkas=${berkas%\'}
    berkas=${berkas#\'}
fi

if [[ -f "$berkas" ]]
then
    echo " $berkas found"
else    
    echo " Could not find $berkas"
fi

按照 中的建议(感谢 Etan),我添加了一个检查变量是否以单引号开头和结尾,这使脚本稍微安全一些。我还将 -r 开关添加到 read,您几乎总是想使用它。

免责声明

值得一提的是,这种方法会不加选择地删除变量开头 and/or 结尾的引号,因此如果您的文件名可能在这些位置合法地包含引号,则此方法将不起作用。