在curl命令中使用变量在bash脚本中不起作用

在curl命令中使用变量在bash脚本中不起作用

我正在尝试编写一个 bash 脚本来更新存储库中的某些节点。我写了下面的脚本,但是当我在 .txt 中使用变量时它似乎不起作用curl。下面是代码。我使用""inside语句尝试了所有可能的组合curl来解析变量。但它似乎没有更新节点。 (运行脚本时我没有收到任何错误)。

我重复了这curl句话:

echo "curl --user admin:admin "$final_add" http://localhost:4502"$a""

并将其输出放入脚本中,然后脚本运行良好并更新节点。

任何人都可以为我提供一些关于为什么我不能使用curl中的变量更新节点的指导吗?

下面的代码示例

#!/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。解决办法是不是取消引用变量扩展以依赖 shell 正确分割字符串。

当您有一个需要传递给程序的内容列表时分离项目,使用数组:

#!/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

相关内容