셸에서 $*의 각 요소에 문자열을 추가합니다.

셸에서 $*의 각 요소에 문자열을 추가합니다.

$*저는 입력을 받아 주어진 문자열이 접두어와 접미사가 붙은 모든 요소로 확장되는 가장 간단한 솔루션을 찾고 있습니다 .

$*=foo bar baz
<solution(x,y)>=xfooy xbary xbazy

앞에 추가하거나 추가할 수 있지만 둘 다 수행할 수는 없습니다.

echo ${*/#/x}
# prints xfoo xbar xbaz
echo ${*/%/y}
# prints fooy bary bazy

이 두 가지 솔루션을 결합할 수는 없습니다. 이것문서매개변수=* 경우 확장자가 반환한 값이 리스트라고 하는데 이렇게 사용할 수는 없습니다. 결과 값 배열을 추가 명령에 별도의 인수로 전달하려고 하므로 단순히 단일 문자열을 만드는 것만으로는 작동하지 않습니다.

답변1

${var/pattern/replacement}zsh는 ksh93 매개변수 확산 연산자이며 mksh, 및 에서도 지원되지만 bash몇 가지 변형이 있습니다( mksh은 현재 배열에서 작동하지 않습니다).

크쉬 93

에서는 with 접두사와 접미사 with with를 붙여 배열의 각 요소에 대해 이 작업을 수행 ksh93해야 합니다 .${var/*/x\0y}$varxy${array[@]/*/x\0y}

따라서 위치 인수 배열의 경우:

print -r -- "${@/*/x\0y}"

(그러나 귀하와 마찬가지로 ${*/#/x}위치 매개변수 목록이 비어 있으면 오류가 발생합니다.)

다루기 힘든

zshksh93\0대체 문자열을 일치시키기 위해 s를 호출하는 것과 동등한 것은 이지만 패턴에서 사용하는 $MATCH경우에만 해당됩니다 ( 이에 대한 옵션이 필요함).(#m)extendedglob

set -o extendedglob
print -r -- "${@/(#m)*/x${MATCH}y}"

하지만 에서는 zsh매개변수 확장을 중첩할 수 있으므로 다음과 같은 작업도 수행할 수 있습니다.

print -r -- ${${@/#/x}/%/y}

$^array해당 배열 확장을 여는 연산자를 사용하는 것을 선호할 수도 있지만 rcexpandparam중괄호 확장처럼 동작하도록 만듭니다.

print -r -- x$^@y

또는 다음을 사용할 수 있습니다.

printf -v argv x%sy "$@"

수정 위치 $@(또는 $argvin)(여기서는 그렇지 않다고 가정)zsh"$@"빈 목록).

세게 때리다

bash셸 에서는 다음과 같이 중간 배열을 사용하여 두 단계로 이 작업을 수행해야 할 수도 있습니다.@L.ScottJohnson 표시, 또는 $@그 자리에서 수정:

set -- "${@/#/x}"
echo -E "${@/%/y}"

(이 경우 접두사( x이 경우)는 로 시작하지 않는다고 가정합니다 -.)

POSIX적으로

루프를 사용하여 위치 매개변수를 내부에서 수정할 수 있습니다.

for i do
  set -- "$@" "x${i}y"
  shift
done
echo "$@"

(단, echo백슬래시 문자를 포함하거나 로 시작하는 임의의 데이터를 표시하기 위해 이식적으로 사용할 수는 없습니다 -.)

노트

$*인수 확장 형식(인용할 때만 유용함)은 다음 형식이라는 점에 유의하세요.연결하다위치 매개변수( $IFS기본 첫 번째 문자는 SPC임) $@모든 위치 매개변수를 구분된 매개변수로 확장 해야 합니다 (다시 인용). $*따옴표 가 없고 ( 비어 있지 않은 위치 인수로 확장하지 $@않는 한) 거의 의미가 없습니다 . 왜냐하면 분할+글로브의 영향을 받고 쉘 간에 다르게 동작하기 때문입니다.zsh

답변2

#!/bin/bash
echo $*
FIELDS=("${@/#/x}")
FIELDS=("${FIELDS[@]/%/y}")
echo "${FIELDS[*]}"

실행 시간:

$ t.sh foo bar baz
foo bar baz
xfooy xbary xbazy

답변3

목록이 주어지면 $@
...인쇄하세요

set -- foo bar baz
printf '%s\n' "$@"
foo
bar
baz

...목록 작업 수행

set -- $(printf 'x%sy ' "$@")
printf '%s\n' "$@"
xfooy
xbary
xbazy

... 문자열화된 목록

printf '%s\n' "$*"
xfooy xbary xbazy

특별한 bash 기능은 포함되지 않습니다.

관련 정보