bash 字符串替换的不一致行为

Key*_*ger 1 bash filenames variable

当我用一个子字符串替换另一个子字符串(如本文档中所述)打印变量时,它的行为正确:

stringZ='abc - 123'

echo $stringZ             # abc - 123

echo ${stringZ/ - /test}  # abctest123
Run Code Online (Sandbox Code Playgroud)

但是,如果我从文件名中获取字符串,则完全忽略替换:

for f in mp3/*; do

    stringZ=$(basename $f)

    echo $stringZ             # abc - 123.txt

    echo ${stringZ/ - /test}  # abc - 123.txt

done
Run Code Online (Sandbox Code Playgroud)

如何替换从文件名派生的变量中的子字符串?

ter*_*don 5

答案是,像往常一样,您需要始终引用您的变量

$ ls -N mp3/
abc - 123.txt
Run Code Online (Sandbox Code Playgroud)

现在,让我们试试你的循环:

$ for f in mp3/*; do 
    stringZ=$(basename $f); 
    echo $stringZ; 
    echo ${stringZ/ - /test} ; 
done
basename: extra operand ‘123.txt’
Try 'basename --help' for more information.
Run Code Online (Sandbox Code Playgroud)

发生的情况是$f变量具有 value mp3/abc - 123.txt,因此您正在运行basename mp3/abc - 123.txt并且抱怨,因为它看到了空间并假定这mp3/abc是第一个参数。如果您引用,它应该按预期工作:

$ for f in mp3/*; do 
    stringZ=$(basename "$f"); 
    echo "$stringZ"; 
    echo "${stringZ/ - /test}" ; 
done
abc - 123.txt
abctest123.txt
Run Code Online (Sandbox Code Playgroud)

这里只有 中的引号basename "$f"是绝对必要的,但总是引用你的变量是一个好习惯。


归档时间:

查看次数:

51 次

最近记录:

6 年,4 月 前