-p
함수에 전달된 각 매개변수에 접두사를 추가하는 방법은 무엇입니까 ?
매개변수 자체를 수정하는 것과 새 배열을 만드는 것이 모두 가능합니다.
답변1
이는 공백이 있거나 그보다 더 나쁜 복잡한 매개변수의 경우에도 잘 작동합니다.
#!/bin/bash
new_args=()
for arg
do
new_args+=( '-p' )
new_args+=( "$arg" )
done
for arg in "${new_args[@]}"
do
echo "$arg"
done
시험:
$ ~/test.sh foo $'bar\n\tbaz bay'
-p
foo
-p
bar
baz bay
답변2
${ARGS[@]/#/-p }
변수를 빈 문자열로 설정 하면 IFS
확장 시 공백을 유지할 수 있습니다!
# sample code
(
set -- 1 2 3 'arg with spaces' $'bar\n\tbaz bay'
printf 'oldIFS: %q\n' "$IFS"
IFS=""
#IFS=" "
printf 'newIFS: %q\n' "$IFS"
ARGS=("$@")
ARGS=( ${ARGS[@]/#/-p } )
for ((i=0; i < ${#ARGS[@]}; i++)); do
echo "$i: ${ARGS[i]}"
done
)
함수 내에서 을 IFS
사용하여 수정된 변수의 범위를 해당 함수로 제한 할 수 있습니다 declare IFS=""
.
답변3
매개 변수를 배열에 넣고 사용하십시오.배쉬 패턴 교체배열 교체 및 접두사 일치를 수행합니다.
ARGS=("$@")
echo ${ARGS[@]/#/-p }
이렇게 하면 각 매개변수의 시작 부분이 로 대체됩니다 -p<space>
.
불행하게도 매개변수에 공백이 있으면 제대로 작동하지 않습니다. 공백은 사용 시 올바르게 유지되지만 ARGS=("$@")
확장 시에는 유지되지 않습니다 ${ARGS[@]/#/-p }
. 확장 주위에 큰따옴표를 추가할 수 있지만 -p arg1
두 개가 아닌 하나의 매개변수를 얻게 됩니다.
-p<space>
앞에 추가가 필요하지 않으면 -p
확장 주위에 큰따옴표를 넣으십시오. 확장명 주위에 큰따옴표를 사용하거나 사용하지 않고 가장 적합한 것이 무엇인지 확인하십시오.