单引号文件路径上的测试失败

时间:2015-01-02 09:29:04

标签: bash

我写了一个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窗口拖到脚本窗口),它就失败了:

 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,我会很高兴。

Thanx:)

1 个答案:

答案 0 :(得分:3)

您可以使用以下命令从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" ]]

此外,您不必使用printf并手动附加\n换行符,而只需使用echo

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

正如the comments中所建议的那样(感谢Etan),我添加了一个检查,变量以单引号开头和结尾,这使得脚本更安全一些。我还将-r切换添加到read,您几乎总是想要使用它。

声明

值得一提的是,这种方法不加选择地从变量的开头和/或结尾删除引号,因此,如果您的文件名可能合法地包含这些位置的引号,则无效。