스크립트에서 연결된 키/값 쌍의 문자열을 생성하는 방법은 무엇입니까?

스크립트에서 연결된 키/값 쌍의 문자열을 생성하는 방법은 무엇입니까?

--build-arg일부 키/값 쌍(build.args 파일)을 사용하여 busybox 셸에서 인수 문자열을 작성 해야 합니다 .

스크립트 파일

#!/bin/sh
one=$1
two=$2
shift

while IFS= read -r line; do
    set "$@" --build-arg "$line"
done < "build.args"

echo "$@"

빌드 매개변수

ONE=first
TWO=second

실행 sh script.sh foo bar(예, 스크립트에는 두 개의 인수가 필요함)은 build.args의 내용을 읽고 키/값 쌍을 --build-arg인수로 추가하고 이 결과 문자열을 출력해야 합니다. 이것이 내가 기대하는 것입니다:

--build-arg ONE=first --build-arg TWO=second

하지만 내 스크립트를 통해 나는

bar --build-arg ONE=first --build-arg TWO=second

as는 bar스크립트 호출의 두 번째 매개변수로 전달됩니다.

답변1

bar루프 이전의 작업 $1뒤에 오는 것이기 때문에 거기에 들어갑니다 .shift

두 개의 위치 매개변수를 끄려면 를 사용하십시오 shift 2. 그러나 before looping 으로 대체하여 shift위치 인수 목록을 지우는 것이 더 안전할 수 있습니다 set --. 이렇게 하면 올바른 수의 매개변수를 제공하기 위해 사용자에게 의존할 필요가 없습니다. 일부 쉘은 목록에 있는 것보다 더 많은 값을 제거하려고 하면 진단 메시지를 발행하며, 사용자가 너무 적거나 너무 많은 값을 제공하면 값이 여전히 남아 있습니다 "$@".

또한 이 경우와 일반적으로 위치 인수를 설정할 때 실수로 쉘 옵션을 설정하거나 이 경우 유효하지 않은 옵션으로 호출하는 것을 방지하려면 set --일반 대신 in을 사용해야 합니다 .setset

set -- "$@" --build-arg "$line"

관련 정보