Bash 文字列置換の一貫性のない動作

Bash 文字列置換の一貫性のない動作

変数を印刷するときは、次の説明に従って、あるサブストリングを別のサブストリングに置き換えます。この文書、正しく動作します。

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"が絶対に必要ですが、常に変数を引用することをお勧めします。

おすすめ記事