我正在尝试编写一个 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
。