특별한 순서 없이 printf에 인수를 인쇄합니다.

특별한 순서 없이 printf에 인수를 인쇄합니다.

특별한 순서 없이 coreutils의 매개변수를 어떻게 참조합니까?printf

내가 피하고 싶은 것은 다음과 같습니다.

$ printf '%s %s %s %s %s %s %s' a c a c b c a
a c a c b c a

이것이 내가 하고 싶은 일이다:

$ printf '%s %s³ %s¹ %s³ %s² %s³ %¹' a b c
a c a c b c a

이는 Perl로 구현되었습니다.

perl -e 'printf ("%s %3\$s %1\$s %3\$s %2\$s %3\$s %1\$s\n", 'a', 'b', 'c');'
a c a c b c a

4개의 매개변수만 전달됩니다 printf.

답변1

이 작업을 수행하는 기본 제공 방법을 찾을 수 없습니다. 다음과 같이 루프에서 언제든지 매개변수를 생성할 수 있습니다.

for 루프

$ printf '[ -d %s ] || mkdir %s; cd %s\n' `for run in {1..3}; do echo "$dir";done`

약간 다른:

$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(for run in {1..3}; do echo "$dir";done)

명령의 이 부분을 변경하여 인수 수를 제어할 수 있습니다 {1..3}.

시퀀스 및 xargs

$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(seq 1 3 | { xargs -i -- echo "$dir"; })

이는 1부터 3까지의 일련의 숫자를 생성하고 { xargs -i ... }가 실행되는 횟수를 제어합니다.

@rici의 의견 덕분에 다음 구성을 사용할 수도 있습니다 yes ... | head -n 3.

$ printf '[ -d %s ] || mkdir %s; cd %s\n' $(yes "$dir" | head -n 3)

인용하다

답변2

Bash의 Printf는 이 옵션을 구현하지 않습니다.

그러나 간단한 해결책은 변수를 사용하는 것입니다.

$ a=a b=b c=c
$ printf '%s %s %s %s %s %s %s\n' "$a" "$c" "$a" "$c" "$b" "$c" "$a"
a c a c b c a

위치 매개변수도:

$ set -- a b c
$ printf '%s %s %s %s %s %s %s\n' "$1" "$3" "$1" "$3" "$2" "$3" "$1"
a c a c b c a

관련 정보