我写了一个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:)
答案 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
,您几乎总是想要使用它。
值得一提的是,这种方法不加选择地从变量的开头和/或结尾删除引号,因此,如果您的文件名可能合法地包含这些位置的引号,则无效。