Непоследовательное поведение замены строки bash

ubuntu puede usareject -m; reboot -f

1
12.06.2019, 22:56
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", но всегда цитировать ваши переменные — это хорошая привычка.

5
27.01.2020, 23:15

Теги

Похожие вопросы