单引号文件路径测试失败
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 结尾的引号,因此如果您的文件名可能在这些位置合法地包含引号,则此方法将不起作用。
我写了一个 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
按照 -r
开关添加到 read
,您几乎总是想使用它。
免责声明
值得一提的是,这种方法会不加选择地删除变量开头 and/or 结尾的引号,因此如果您的文件名可能在这些位置合法地包含引号,则此方法将不起作用。