다음 명령을 실행하고 있습니다.
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
.