bash 스크립트에서 작동하지 않는 컬 명령의 변수 사용

bash 스크립트에서 작동하지 않는 컬 명령의 변수 사용

저장소의 특정 노드를 업데이트하기 위해 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.

관련 정보