저장소의 특정 노드를 업데이트하기 위해 bash 스크립트를 작성하려고 합니다. 아래 스크립트를 작성했는데 .txt에 있는 변수를 사용하면 작동하지 않는 것 같습니다 curl
. 아래는 코드입니다. 변수를 해결하기 위해 ""
내부 문을 사용하여 가능한 모든 조합을 시도했습니다 . curl
하지만 노드를 업데이트하지 않는 것 같습니다. (스크립트를 실행할 때 오류가 발생하지 않습니다.)
나는 다음 curl
문장을 반복했습니다.
echo "curl --user admin:admin "$final_add" http://localhost:4502"$a""
출력을 스크립트에 넣으면 스크립트가 제대로 실행되고 노드가 업데이트됩니다.
컬에서 변수를 사용하여 노드를 업데이트할 수 없는 이유에 대한 안내를 제공해 줄 수 있는 사람이 있나요?
아래 코드 예시
#!/bin/bash
echo "-------------------------------------------------------------------------------------------------------------------"
echo "Script to set tags"
echo "-------------------------------------------------------------------------------------------------------------------"
if [ true ]
then
echo "**firing curl command for tags2**"
a="/content/test/events/whats-on/all-about-women-home/2018/wine-tasting/jcr:content"
i="[/content/cq:tags/sales-stage/pre-sale,/content/cq:tags/sales-stage/special-offer]"
str=$i
IFS=,
ary=($str)
for key in "${!ary[@]}"; do tags_paths+="-Ftags2=${ary[$key]} "; done
final_paths=$(echo $tags_paths | sed "s|[2],]||g")
final_add="-Ftags2@TypeHint=\"String[]\" ${final_paths//[[[\[\]]/}"
#have tried this without quotes too --eg : (curl --user admin:admin $final_add http://localhost:4502$a) it too didnt work
curl --user admin:admin "$final_add" http://localhost:4502"$a"
fi
답변1
문제는 주로 -F
문자열의 플래그 와 관련이 있습니다 $final_paths
. 이는 단일 매개변수로 전달됩니다 curl
. 해결책은아니요쉘 분할 문자열을 올바르게 사용하려면 변수 확장을 인용 해제하십시오.
프로그램에 전달해야 하는 콘텐츠 목록이 있는 경우분리배열을 사용하는 항목:
#!/bin/bash
url='http://localhost:4502'
url+='/content/test/events/whats-on/all-about-women-home/2018/wine-tasting/jcr:content'
tag_paths=(
'/content/cq:tags/sales-stage/pre-sale'
'/content/cq:tags/sales-stage/special-offer'
)
curl_opts=( --user "admin:admin" --form "tags3@TypeHint=String[]" )
for tag_path in "${tag_paths[@]}"; do
curl_opts+=( --form "tags2=$tag_path" )
done
curl "${curl_opts[@]}" "$url"
curl
여기에 배열에 전달하려는 옵션을 넣습니다 curl_opts
. 우리는 항상 거기에 있을 것으로 알고 있는 것으로 이 배열을 시작한 다음 배열을 반복하여 레이블 경로 옵션을 추가합니다 tag_paths
. "${curl_opts[@]}"
끝에 있는 큰따옴표 확장은 curl_opts
배열의 모든 요소로 확장되며 각 요소는 개별적으로 인용됩니다.
또한 정적이기 때문에 처음에 전체 URL을 작성하기로 선택했고, curl
이것이 스크립트이고 (가독성을 위해) 좀 더 자세히 설명할 수 있으므로 긴 옵션을 사용했습니다.
IFS
이렇게 하면 인용이 직관적이 되고 쉼표로 구분된 목록 구문 분석, 특수 문자 이스케이프 또는 기본값이 아닌 값 설정에 대해 걱정할 필요가 없습니다 .
동일한 스크립트이지만 다음의 경우 /bin/sh
:
#!/bin/sh
url='http://localhost:4502'
url="$url/content/test/events/whats-on/all-about-women-home/2018/wine-tasting/jcr:content"
set -- \
'/content/cq:tags/sales-stage/pre-sale' \
'/content/cq:tags/sales-stage/special-offer'
for tag_path do
set -- "$@" --form "tags2=$tag_path"
shift
done
set -- --user "admin:admin" --form "tags3@TypeHint=String[]" "$@"
curl "$@" "$url"
여기서는 배열 사용으로 제한됩니다. $@
이 배열의 요소를 설정합니다 set
.