我正在 Bash 中测试文件是否存在,其中文件名使用转义$(printf '%q' "$FNAME")
.
这总是会产生错误if [ -f $FNAME ]
如下面评论的示例所示。如何测试包含空格和其他字符的文件名?
#!/usr/bin/env bash
# code used in Raspberry Pi Podcasting Jukebox project
# youtube-dl -f 17 --get-filename https://www.youtube.com/watch?v=AgkM5g_Ob-w
# returns "HOW ABUNDANCE WILL CHANGE THE WORLD - Elon Musk 2017-AgkM5g_Ob-w.3gp"
# Purpose: To test if file exists before downloading
# for testing purposes using an existing regular file "abc def ghi"
AFILE="abc def ghi"
TFILE=$(printf '%q' "$AFILE") # Escaping filename using printf
echo $TFILE # returns abc\ def\ ghi
# if [ -f $AFILE ] # this test returns false every time with error [:too many arguments
if [ -f $TFILE ] # This test also returns FALSE with err [: too many arguments
then
echo "Existing"
# don't download
else
echo "Not existing"
# youtube-dl http://www.youtube.com/watch?v=AgkM5g_Ob-w
fi
始终引用您的文件名,使用的想法%q
用于转义空格是正确的,但是当与[
未加引号的运算符$TFILE
被分成多个单词导致-f
当操作数实际上期望单个参数时,它会接收太多参数。因此,一旦对它进行双引号,空格就会被保留,并且在条件中传递一个文字单个参数。
testFile="abc def ghi"
printf -v quotedFile '%q' "$testFile"
if [ -f "$quotedFile" ]; then
printf 'My quoted file %s exists\n' "$quotedFile"
fi
上述内容应该很好地适用(使用[
) 在任何 POSIX 兼容的 shell 中。但如果您的目标脚本是bash
单独使用 shell,您可以使用[[
其中引用是不必要的,因为它被评估为一个表达式。所以你可以这样做
file_with_spaces="abc def ghi"
if [[ -f $file_with_spaces ]]; then
printf 'My quoted file %s exists\n' "$file_with_spaces"
fi
但一般来说,在变量中添加引号并没有什么坏处bash
。你总是可以做到的。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)