Bash 기능: $@ 명령을 실행하면 각 매개변수가 순서대로 개별적으로 실행됩니다.

Bash 기능: $@ 명령을 실행하면 각 매개변수가 순서대로 개별적으로 실행됩니다.

다음은 예제 함수입니다.

function example { echo "TextBefore $@ TextAfter" ; }

다음은 해당 기능을 사용하는 명령입니다.

example A{1..5}B

산출:

TextBefore A1B A2B A3B A4B A5B TextAfter

내가 원하는 모습은 다음과 같습니다.

TextBefore A1B TextAfter
TextBefore A2B TextAfter
TextBefore A3B TextAfter
TextBefore A4B TextAfter
TextBefore A5B TextAfter

그것이 제가 설명할 수 있는 최선의 방법입니다. 그것을 이해하고 더 나은 설명 방법을 알고 있다면 질문을 편집하십시오.

이 예에 표시된 것처럼 시퀀스의 각 [여기에 단어 삽입]을 개별적으로 실행하려면 어떻게 해야 합니까?

답변1

이 시도:

function example { printf 'TextBefore %s TextAfter\n' "$@"; }

답변2

printf대신 사용하십시오 echo. printf유틸리티는 형식 문자열을 첫 번째 인수로 사용합니다(이는언제나은 작은따옴표로 묶인 문자열입니다. 문자열에는 추가 매개변수에 대한 자리 표시자가 포함됩니다.

printf 'TextBefore %s TextAfter\n' "$@"

의 매개변수가 "$@"지정된 위치에 삽입됩니다 %s. 형식 문자열에는 %s자리 표시 자가 하나만 있으므로 형식 문자열은 각 매개변수에 대해 차례로 재사용됩니다. 이는 printf다른 언어의 작동 방식과 다릅니다.

printf종료 개행 문자는 기본적으로 출력되지 않습니다 .

예:

$ printf 'AAA %s BBB\n' 1 2 3 4 5
AAA 1 BBB
AAA 2 BBB
AAA 3 BBB
AAA 4 BBB
AAA 5 BBB

형식 문자열에 더 많은 자리 표시자가 있는 경우 이러한 자리 표시자는 지정된 매개변수로 순서대로 채워집니다 printf. 사용 가능한 매개변수가 더 있는 경우 모든 자리 표시자를 채운 후 형식 문자열이 재사용됩니다.

$ printf 'AAA %s %03d BBB\n' 1 2 3 4 5
AAA 1 002 BBB
AAA 3 004 BBB
AAA 5 000 BBB

따라서 귀하의 기능은 다음과 같습니다

example () {
    [ "$#" -gt 0 ] && printf 'TextBefore %s TextAfter\n' "$@"
}

또한보십시오:

답변3

두 답변 모두 OP가 인수를 인쇄하기를 원한다고 가정하지만 괄호 안에 인수를 전달하려고 할 수도 있습니다.기타 명령또는 .echoprintf

쉘에는 etc[1]이 없으므로 mapcar유일한 방법은 간단한 루프( cmd자리 표시자를 실제 명령으로 대체)입니다.

function example { for arg; do cmd "TextBefore $arg TextAfter"; done; }

참고로 원본에서는 echo "TextBefore $@ TextAfter"호출이 a , , ..., $@로 설정되었을 때 별도의 인수가 will , , ..., 로 전달되었습니다 . 활용하기에는 별 의미가 없는 상황 입니다 .A1BA2BA5BechoTextBefore A1BA2BA5B TextAfter$@

xargs[1] 맞는 말이지만 이렇게 단순한 경우에는 함정과 단점을 극복하는 수고를 할 가치가 없습니다 .xargs

관련 정보