変数を印刷するときは、次の説明に従って、あるサブストリングを別のサブストリングに置き換えます。この文書、正しく動作します。
stringZ='abc - 123'
echo $stringZ # abc - 123
echo ${stringZ/ - /test} # abctest123
ただし、ファイル名から文字列を取得すると、置換は完全に無視されます。
for f in mp3/*; do
stringZ=$(basename $f)
echo $stringZ # abc - 123.txt
echo ${stringZ/ - /test} # abc - 123.txt
done
ファイル名から派生した変数の部分文字列を置き換える方法は?
答え1
いつものように答えは変数を常に引用する必要があります。:
$ ls -N mp3/
abc - 123.txt
それではループを試してみましょう。
$ 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.
何が起こっているのか$f
変数に値があるので、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
ここでは引用符だけbasename "$f"
が絶対に必要ですが、常に変数を引用することをお勧めします。