$*
저는 입력을 받아 주어진 문자열이 접두어와 접미사가 붙은 모든 요소로 확장되는 가장 간단한 솔루션을 찾고 있습니다 .
$*=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}
$var
x
y
${array[@]/*/x\0y}
따라서 위치 인수 배열의 경우:
print -r -- "${@/*/x\0y}"
(그러나 귀하와 마찬가지로 ${*/#/x}
위치 매개변수 목록이 비어 있으면 오류가 발생합니다.)
다루기 힘든
zsh
ksh93
\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 "$@"
수정 위치 $@
(또는 $argv
in)(여기서는 그렇지 않다고 가정)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 기능은 포함되지 않습니다.