Ответ, как обычно, вам нужно всегда заключать свои переменные в кавычки:
$ 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"
, но всегда цитировать ваши переменные — это хорошая привычка.