공백을 추가하지 않고 bash에서 문자열 매개변수를 여러 줄로 분할하는 방법

공백을 추가하지 않고 bash에서 문자열 매개변수를 여러 줄로 분할하는 방법

다음 명령을 실행하고 있습니다.

some_command --flag "foo\
    bar\
    quux" arg2

이로 인해 문자열이 로 전달됩니다 foo\tbar\tquux.

탭을 사용하지 않고(또는 다른 공백 문자를 추가하지 않고) 이 매개변수를 전달하는 방법을 찾고 있습니다.하지만들여쓰기를 유지하세요(내 스크립트를 읽을 수 있도록).

답변1

some_command --flag "$(printf '%s' foo\
    bar\
    quux)" arg2

가장 읽기 쉽지는 않지만 그렇게 할 것입니다. "foo", "bar" 및 "quux"를 printf명령에 대한 인수 및 %s형식 문자열로 전달합니다 . 인수보다 적은 수의 형식 문자가 제공되면 형식 문자열은 필요에 따라 반복됩니다. 이는 %s%s%s세 문자열을 모두 공백 없이 순서대로 인쇄하는 것과 같습니다 . 마지막으로 "foobarquux" 명령의 출력은 printf인수로 대체됩니다 some_command.

답변2

도우미 기능을 사용하세요:

concat () (
    IFS=
    printf '%s' "$*"
)

printf '"%s"\n' "$(concat "foo" \
    "bar" \
    "baz" )"

이것은 출력됩니다

"foobarbaz"

또는 먼저 인수의 문자열 비트를 배열에 넣은 다음 실제 인수를 별도로 만듭니다(배열이 있는 셸을 사용한다고 가정).

concat () (
    IFS=
    printf '%s' "$*"
)

args=(
    "foo"
    "bar"
    "baz"
)

concat_args=$( concat "${args[@]}" )

printf '"%s"\n' "$concat_args"

위의 POSIX 셸과 동일:

concat () (
    IFS=
    printf '%s' "$*"
)

set -- \
   "foo" \
   "bar" \
   "baz"

concat_args=$( concat "$@" )

printf '"%s"\n' "$concat_args"

실행의 함수 본문은 concat자체 하위 셸에서 실행됩니다(이것이 바로 (...)실행되는 작업입니다). 이는 변경 사항이 IFS함수에 대해 로컬이라는 것을 의미합니다.

함수에서 "$*"대체를 사용하는 이유는 순전히 미학적입니다. "$@"프로그램이 "$*"확대될 예정입니다.하나의인쇄될 문자열입니다 printf. 이 경우 실제 연결은 $*구분 기호(비어 있음) 없이 쉘 확장에 의해 수행 됩니다 $IFS. 대신 이를 사용하면 형식 문자열이 반복적으로 적용되는 "$@"여러 개의 개별 문자열로 확장됩니다 . printf이 경우 연결은 다음과 같습니다.부작용특정 형식 문자열을 printf.

또는 동일한 아이디어(실제 인수 문자열을 별도로 생성)이지만 해당 도우미 함수가 없는 경우

arg=\
"foo"\
"bar"\
"baz"

printf '"%s"\n' "$arg"

printf '"%s"\n'모든 경우에 위 사항은 귀하의 것입니다 some_command --flag.

관련 정보