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)
如何替换从文件名派生的变量中的子字符串?
答案是,像往常一样,您需要始终引用您的变量:
$ 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 次 |
| 最近记录: |