마십시오 하지 사용 eval
! 임의의 코드가 실행될 위험이 있습니다.
BashFAQ-50- 변수에 명령을 넣으려고하는데 복잡한 경우는 항상 실패합니다.
배열에 넣고 큰 따옴표 "${arr[@]}"
로 모든 단어를 확장 하여 단어 분할 로 인해 단어 가 분할 되지 않도록합니다 .IFS
cmdArgs=()
cmdArgs=('date' '+%H:%M:%S')
내부 배열의 내용을 확인하십시오. 을 declare -p
사용하면 각 명령 매개 변수를 사용하여 별도의 인덱스로 배열의 내용을 볼 수 있습니다. 그러한 인수 중 하나에 공백이 포함 된 경우 배열에 추가하는 동안 내부를 인용하면 Word-Splitting으로 인해 분할되지 않습니다.
declare -p cmdArgs
declare -a cmdArgs='([0]="date" [1]="+%H:%M:%S")'
다음과 같이 명령을 실행하십시오.
"${cmdArgs[@]}"
23:15:18
(또는) 모두 bash
함수를 사용 하여 명령을 실행합니다.
cmd() {
date '+%H:%M:%S'
}
다음과 같이 함수를 호출하십시오.
cmd
POSIX sh
에는 배열이 없으므로 가장 가까운 방법은 위치 매개 변수에 요소 목록을 작성하는 것입니다. 다음 sh
은 메일 프로그램을 실행 하는 POSIX 방법입니다.
# POSIX sh
# Usage: sendto subject address [address ...]
sendto() {
subject=$1
shift
first=1
for addr; do
if [ "$first" = 1 ]; then set --; first=0; fi
set -- "$@" --recipient="$addr"
done
if [ "$first" = 1 ]; then
echo "usage: sendto subject address [address ...]"
return 1
fi
MailTool --subject="$subject" "$@"
}
이 접근 방식은 리디렉션없이 간단한 명령 만 처리 할 수 있습니다. 리디렉션, 파이프 라인, for / while 루프, if 문 등을 처리 할 수 없습니다.
또 다른 일반적인 사용 사례는 curl
여러 헤더 필드 및 페이로드로 실행할 때 입니다. 항상 아래와 같이 인수를 정의 curl
하고 확장 된 배열 콘텐츠를 호출 할 수 있습니다.
curlArgs=('-H' "keyheader: value" '-H' "2ndkeyheader: 2ndvalue")
curl "${curlArgs[@]}"
다른 예시,
payload='{}'
hostURL='http://google.com'
authToken='someToken'
authHeader='Authorization:Bearer "'"$authToken"'"'
이제 변수가 정의되었으므로 배열을 사용하여 명령 인수를 저장하십시오.
curlCMD=(-X POST "$hostURL" --data "$payload" -H "Content-Type:application/json" -H "$authHeader")
이제 적절한 인용 확장을 수행하십시오.
curl "${curlCMD[@]}"