다음과 같은 값을 갖는 "arr"라는 배열이 있습니다.
post-ro
post-ro-1
post-ro-2
이 변수가 있습니다.
str="su scp [email protected]:/etc/bp/pg/pri/user.json /etc/bp/pg/pri"
str
변수에 있는 값을 대체하여 pg
변수에 정의된 명령을 실행 하고 싶습니다 arr
. 의 명령은 str
의 값을 반복하고 명령의 각 값을 순차적으로 교체하여 3번(배열의 길이) 실행되어야 합니다 arr
.pg
따라서 최종 명령은 다음과 같아야 합니다.
su scp [email protected]:/etc/bp/post-ro/pri/user.json /etc/bp/post-ro/pri
su scp [email protected]:/etc/bp/post-ro-1/pri/user.json /etc/bp/post-ro-1/pri
su scp [email protected]:/etc/bp/post-ro-2/pri/user.json /etc/bp/post-ro-2/pri
답변1
GNU를 사용 하고 공백으로 구분된 인수 목록이 에 전달된다고 xargs
가정하면 다음과 같이 할 수 있습니다.$str
su
print0() {
[ "$#" -eq 0 ] || printf '%s\0' "$@"
}
IFS=' ' # split on space only
set -o noglob # disable globbing
xargs -r0a <(print0 "${arr[@]}") -I pg -- $str
(따옴표를 해제하면 $str
분할+glob이 호출되며, 여기서 glob은 비활성화되고 분할은 공간적으로만 분할하라는 지시를 받습니다.)
$str
명령에 인수를 포함하려면 배열 su
을 사용하는 것이 더 합리적입니다.
str=(
su scp [email protected]:/etc/bp/pg/pri/user.json /etc/bp/pg/pri
)
xargs -r0a <(print0 "${arr[@]}") -I pg -- "${str[@]}"
$IFS
그러면 해당 문자열을 매개변수로 분류 하거나 분할할 필요가 없습니다 noglob
.