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

おすすめ記事