bash 脚本中使用变量的卷曲命令
Curl command in bash script using variables
我有一个如下所示的 curl 命令:
curl -X PUT -H "myheader:coca-cola" -d '{ "name":"harrypotter" }' http://mygoogle.com/service/books/123
运行 这个命令是通过终端 returns 预期的结果。
我正在尝试将此 curl 命令合并到我的 bash 脚本中,如下所示:
#!/bin/bash
MYURL=http://mygoogle.com/service/books/123
# Generate body for curl request
generate_put_data()
{
cat <<EOF
{
"name":"harrypotter"
}
EOF
}
put_data=$(echo "$(generate_put_data)")
put_data_with_single_quotes="'$put_data'"
# Generate headers for curl request
header=myheader:coca-cola
header_with_double_quotes="\"$header\""
# The following function takes two inputs - a simple string variable (with no spaces or quotes) and the curl command string
function run_cmd() {
echo
echo
#Run the curl command
""
#Check return code of the curl command
if [ "$?" -ne 0 ]; then
#do something with simple string variable
echo ""
echo "Job failed"
exit 1
else
#do something with simple string variable
echo ""
echo "Job Succeeded"
fi
}
# Run the bash function - run_cmd
run_cmd "mysimplestring" "curl -X PUT -H $header_with_double_quotes -d $put_data_with_single_quotes $MYURL"
但是,当我尝试 运行 上面的 bash 脚本时,它在我使用两个输入调用 run_cmd() 函数时失败了。我收到以下错误:
curl -X PUT -H "myheader:coca-cola" -d '{
"name":"harrypotter"
}' http://mygoogle.com/service/books/123: No such file or directory
Job failed
此错误发生在 run_cmd() 函数声明中正在执行 ""
的行上。
有人可以帮助我了解我哪里出错了吗?谢谢!
""
这将采用第二个参数并尝试 运行 它而不进行任何分词。它把它当作一个字符串。
您将 运行 遇到将 curl 命令作为一个字符串传递的麻烦。如果不带引号传递它会做得更好,就像在命令行中键入它一样。您需要引用每个变量而不是引用整个命令。
run_cmd "mysimplestring" curl -X PUT -H "$header" -d "$put_data" "$MYURL"
请注意,您不再需要 "with_quotes" 变量。你不必做那样的事情。原始的普通值将起作用。
现在您可以使用数组语法访问命令:
function run_cmd() {
local name=; shift
local cmd=("$@")
#Run the curl command
"${cmd[@]}"
}
顺便说一句,这是对echo
的无用使用:
put_data=$(echo "$(generate_put_data)")
做到这一点:
put_data=$(generate_put_data)
我有一个如下所示的 curl 命令:
curl -X PUT -H "myheader:coca-cola" -d '{ "name":"harrypotter" }' http://mygoogle.com/service/books/123
运行 这个命令是通过终端 returns 预期的结果。
我正在尝试将此 curl 命令合并到我的 bash 脚本中,如下所示:
#!/bin/bash
MYURL=http://mygoogle.com/service/books/123
# Generate body for curl request
generate_put_data()
{
cat <<EOF
{
"name":"harrypotter"
}
EOF
}
put_data=$(echo "$(generate_put_data)")
put_data_with_single_quotes="'$put_data'"
# Generate headers for curl request
header=myheader:coca-cola
header_with_double_quotes="\"$header\""
# The following function takes two inputs - a simple string variable (with no spaces or quotes) and the curl command string
function run_cmd() {
echo
echo
#Run the curl command
""
#Check return code of the curl command
if [ "$?" -ne 0 ]; then
#do something with simple string variable
echo ""
echo "Job failed"
exit 1
else
#do something with simple string variable
echo ""
echo "Job Succeeded"
fi
}
# Run the bash function - run_cmd
run_cmd "mysimplestring" "curl -X PUT -H $header_with_double_quotes -d $put_data_with_single_quotes $MYURL"
但是,当我尝试 运行 上面的 bash 脚本时,它在我使用两个输入调用 run_cmd() 函数时失败了。我收到以下错误:
curl -X PUT -H "myheader:coca-cola" -d '{
"name":"harrypotter"
}' http://mygoogle.com/service/books/123: No such file or directory
Job failed
此错误发生在 run_cmd() 函数声明中正在执行 ""
的行上。
有人可以帮助我了解我哪里出错了吗?谢谢!
""
这将采用第二个参数并尝试 运行 它而不进行任何分词。它把它当作一个字符串。
您将 运行 遇到将 curl 命令作为一个字符串传递的麻烦。如果不带引号传递它会做得更好,就像在命令行中键入它一样。您需要引用每个变量而不是引用整个命令。
run_cmd "mysimplestring" curl -X PUT -H "$header" -d "$put_data" "$MYURL"
请注意,您不再需要 "with_quotes" 变量。你不必做那样的事情。原始的普通值将起作用。
现在您可以使用数组语法访问命令:
function run_cmd() {
local name=; shift
local cmd=("$@")
#Run the curl command
"${cmd[@]}"
}
顺便说一句,这是对echo
的无用使用:
put_data=$(echo "$(generate_put_data)")
做到这一点:
put_data=$(generate_put_data)