bash 스크립트에서 인수로 전달된 공백이 포함된 폴더를 반복합니다.

bash 스크립트에서 인수로 전달된 공백이 포함된 폴더를 반복합니다.

필요한 내용에 가깝지만 완전히 정확하지는 않은 수많은 답변을 읽었으며 이를 내 필요에 맞게 조정하는 방법을 모르겠습니다.

소스 폴더를 매개변수로 사용하고 해당 폴더의 각 파일(특정 유형)에 대해 일련의 작업을 수행하는 bash 스크립트를 작성하고 싶습니다.

src_dir=$1

for file in $src_dir/*.jpg; do
    filename=`basename "$file"`
    basename="${filename%.*}"
    ...
done

src_dir에 공백이 없으면 작동하지만 공백이 있으면 작동 방법을 알 수 없습니다. 일반적 "$src_dir"으로 작동하지만 for file in.

편집: 확장해야 하는 변수가 포함된 경로를 전달할 수 있기를 원한다는 점을 언급해야 합니다(etc $HOME, $MY_PROJECT_PATH단일 틱도 이상적이지 않습니다).

답변1

따옴표와 함께 작동하지 않는다고 말하면 인용했다고 가정합니다.전반적인 $src_dir/*.jpg소량. 그렇습니다. *인용된 문자열에서 더 이상 와일드카드 문자가 아니기 때문에 작동하지 않습니다.

그러나 인용만 하면 $src_dir작동합니다.

src_dir=$1

for pathname in "$src_dir"/*.jpg; do
    name_noext=$( basename -- "$pathname" .jpg )
    ...
done

이로 *인해 쉘은 이를 와일드카드 문자로 사용합니다.

편집 내용은 다음과 같습니다. 예를 들어 스크립트를 호출할 때 $HOME다음을 사용하고 있다고 가정합니다.확장HOME리터럴 문자열이 아닌 변수 입니다 $HOME. 문자열이 $HOME변수인지 아니면 디렉토리의 리터럴 이름(기술적으로 그럴 수 있는지)을 결정해야 하는 것을 포함하여 스크립트가 제공된 디렉토리 경로에 리터럴 변수 이름이 포함되어 있는지 여부를 테스트해야 한다면 이는 놀라운 문제가 될 것입니다. 이는 $src_dirfor 루프의 확장과 아무 관련이 없습니다.

답변2

큰따옴표만 있으면 됩니다 src_dir. 또한 임의의 변수로 쉘을 오염시키지 않으려면 하위 쉘을 사용하십시오.(src_dir=$1; for file in "$src_dir"/*.jpg; do ... done)

관련 정보