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"절대적으로 필요하지만 항상 변수를 인용하는 것이 좋습니다.

관련 정보