필요한 내용에 가깝지만 완전히 정확하지는 않은 수많은 답변을 읽었으며 이를 내 필요에 맞게 조정하는 방법을 모르겠습니다.
소스 폴더를 매개변수로 사용하고 해당 폴더의 각 파일(특정 유형)에 대해 일련의 작업을 수행하는 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_dir
for 루프의 확장과 아무 관련이 없습니다.
답변2
큰따옴표만 있으면 됩니다 src_dir
. 또한 임의의 변수로 쉘을 오염시키지 않으려면 하위 쉘을 사용하십시오.(src_dir=$1; for file in "$src_dir"/*.jpg; do ... done)