변수를 인쇄할 때 다음에 설명된 대로 하나의 하위 문자열을 다른 하위 문자열로 바꿉니다.이 문서, 올바르게 작동합니다.
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"
절대적으로 필요하지만 항상 변수를 인용하는 것이 좋습니다.