다음은 예제 함수입니다.
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가 인수를 인쇄하기를 원한다고 가정하지만 괄호 안에 인수를 전달하려고 할 수도 있습니다.기타 명령또는 .echo
printf
쉘에는 etc[1]이 없으므로 mapcar
유일한 방법은 간단한 루프( cmd
자리 표시자를 실제 명령으로 대체)입니다.
function example { for arg; do cmd "TextBefore $arg TextAfter"; done; }
참고로 원본에서는 echo "TextBefore $@ TextAfter"
호출이 a , , ..., $@
로 설정되었을 때 별도의 인수가 will , , ..., 로 전달되었습니다 . 활용하기에는 별 의미가 없는 상황 입니다 .A1B
A2B
A5B
echo
TextBefore A1B
A2B
A5B TextAfter
$@
xargs
[1] 맞는 말이지만 이렇게 단순한 경우에는 함정과 단점을 극복하는 수고를 할 가치가 없습니다 .xargs