제목이 나쁘다면 죄송합니다(이미 제가 생각해 낼 수 있는 최고의 제목입니다).
어쨌든 코드 줄은 다음과 같습니다.
printf "%s\n" "$(echo a b "c d")
간단한 코드. 물론 나중에 내 코드로 대체하겠습니다. 이 예는 설명하기에 충분합니다.
위의 코드는 다음을 출력합니다:
a b c d
내가 원하는 출력은 다음과 같습니다.
a
b
c d
서브쉘을 사용하여.
전체적으로 답변에 있는 코드의 "구조"는 질문의 첫 번째 코드 조각과 대략 유사해야 합니다.
가능합니까? 어떤 도움이라도 좋을 것입니다.
추신 : 의견이 요청되면 개선하기 위해 질문을 편집하겠습니다.
답변1
readarray -td ''
bash에서 배열로 가져올 수 있는 임의의 문자열 목록을 인쇄하려면 (bash-4.4+ 가정) 다음을 사용하여 가져올 수 있는 NUL 구분 목록(bash 변수는 NUL 문자를 포함할 수 없으므로)을 사용할 수 있습니다 .
print0() { [ "$#" -eq 0 ] || printf '%s\0' "$@"; }
readarray -td '' list <(print0 a b "c d" $'e\nf')
또는 배열 정의를 인쇄 typeset -p
하고 imports 를 사용하게 하면 eval
희소 배열이나 여러 배열을 전달할 수도 있습니다.
eval "$( list=(a b "c d" $'e\nf'); typeset -p list)"
이에 대한 도우미를 정의할 수 있습니다.
print_array() {
eval "local $1"='( "${@:2}" )'
typeset -p "$1"
}
bash-5.0$ eval "$(print_array list a b 'b c' $'e\nf')"
bash-5.0$ printf ' - <%s>\n' "${list[@]}"
- <a>
- <b>
- <b c>
- <e
f>
함수 내에서 호출되는 경우 배열은 배열 정의 typeset
앞에 추가 되므로 함수에 대해 로컬이 됩니다.declare -a
인쇄하여 set -- a b 'c d'...
위치 매개변수로 가져올 수도 있습니다.
set_argv() { printf 'set --'; [ "$#" -eq 0 ] || printf ' %q' "$@"; }
bash-5.0$ eval "$(set_argv a b 'b c' $'e\nf')"
bash-5.0$ printf ' - <%s>\n' "$@"
- <a>
- <b>
- <b c>
- <e
f>
bash의 typeset
or 는 printf %q
항상 가장 안전한 인용 방법을 사용하지 않으므로 주의하세요.이 결과 평가와 관련된 잠재적 위험.
답변2
주어진 예에서는 배열을 사용해야 합니다. 바라보다정렬그리고매개변수 확장~에서배쉬 매뉴얼 페이지배열에 대한 추가 정보.
args=(a b "c d")
printf '%s\n' "${args[@]}"
명령 출력을 매개변수로 사용해야 하는 경우 IFS
매개변수를 매개변수 구분 기호 및 명령 대체 요소로 사용할 수 있습니다. 토큰화 후에 와일드카드가 수행되므로 와일드카드를 일시적으로 비활성화할 수 있으며 빈 항목은 토큰화 중에 삭제된다는 점에 유의하는 것이 중요합니다(감사합니다.스티븐 차제라스알림용).
# save previous IFS value and change it to line feed
OLDIFS=$IFS IFS=$'\n'
# temporarily disable globbing if needed
#set -o noglob
# save command output to array, words are separated by IFS
args=($(printf 'arg 1\narg 2\narg 3\n'))
# reenable globbing if needed
#set +o noglob
# restore IFS
IFS=$OLDIFS
# expand array as command arguments
printf '%s\n' "${args[@]}"
사용xargs
더 쉬운 옵션일 수도 있지만 쉘 내장 기능이 아니며 쉘 내장 기능을 직접 호출할 수 없다는 점을 잊지 마십시오. 따라서 아래 예에서는 printf
Bash 내장 기능을 호출하지 않고 printf
바이너리(보통 다음 위치에 있음)를 호출합니다. /bin/printf
또는 /usr/bin/printf
).
# POSIX xargs requires quoting
printf '"arg 1" "arg 2" "arg 3"' | xargs printf '<arg>%s</arg>\n'
# other xargs (like GNU) versions have a `-d` delimiter option
printf 'arg 1\narg 2\narg 3' | xargs -d'\n' printf '<arg>%s</arg>\n'
GNU 및 기타 언어에는 인수를 널 문자(보통 로 표시)로 구분할 수 있는 xargs
(비표준) 옵션도 있는데 , 이는 인수가 널 바이트를 포함할 수 없기 때문에 매우 편리합니다. 다른 명령은 이를 고려하여 표준 옵션은 아니지만 구분된 파일을 사용하는 옵션을 포함하여 많은 버전에서처럼 null 바이트를 사용하여 항목을 구분할 수 있습니다.-0
'\0'
find
-print0
'\0'
# find files under /bin and calculate their sha256 digests
find /bin/ -type f -print0 | xargs -0 sha256sum