curl C壳层变量中的花括号

q5lcpyga  于 2022-11-13  发布在  其他
关注(0)|答案(2)|浏览(165)

这真的快把我逼疯了。我试着把一个命令存储在c shell变量中,然后用eval来执行它。但是我总是找不到“}”

set temp="curl  -v --location --request POST 'http://127.0.0.1:65000/foo/bar/load'  --header 'Content-Type: application/json'  --data-raw '{ "modelType": "john", "resource": "doe" }'"
eval $temp

请帮帮忙。

djmepvbi

djmepvbi1#

shell提供两个字符串:单引号(')和双引号(“)。区别在于使用单引号可以防止对字符串内容的任何解释(例如变量),而使用双引号则允许对字符串内容的任何解释。如果混合使用这两种引号,请确保正确转义字符串。
防止错误的一个简单方法是在字符串中使用单引号或双引号,但不应混用这两种引号。下面是一些示例:

echo '"' # correct
echo ''' # incorrect
echo "'" # correct
echo """ # incorrect

要解决此问题,请将字符串更改为:

set temp = 'echo -v --location --request POST "http://127.0.0.1:65000/foo/bar/load" --header "Content-Type: application/json" --data-raw "{ "modelType": "john", "resource": "doe" }"'

在字符串内使用双引号,字符串用单引号括起来。
如果将创建的变量传递给命令,请确保使用引号。在这种情况下,变量将被解释为单个参数。代码应如下所示:

eval "$temp"

请考虑eval是一个危险的命令。
要了解更多信息,我强烈推荐Paul DuBois的书 Using csh & tcsh。这是一本很好的C-Shell参考书。

vktxenjb

vktxenjb2#

双引号内的双引号应使用"\""转义;用set设置的变量最好用等号与变量名和内容分开;为了避免大括号的特殊含义,eval应该用双引号括起来:

set temp = "curl -v --location --request POST 'http://127.0.0.1:65000/foo/bar/load' --header 'Content-Type: application/json' --data-raw '{ "\""modelType"\"": "\""john"\"", "\""resource"\"": "\""doe"\"" }'"
eval "$temp"

如果您不想使用eval,可以使用别名从FIFO中获取变量:

mkfifo ~/qscr
alias qscr '( echo "$temp" > ~/qscr & ) ; source ~/qscr'

要正确执行多行变量,必须应用:q修饰符:

eval "$temp:q"
alias qscr '( echo "$temp:q" > ~/qscr & ) ; source ~/qscr'

不过,使用别名会更好:

alias temp "curl -v --location --request POST 'http://127.0.0.1:65000/foo/bar/load' --header 'Content-Type: application/json' --data-raw '{ "\""modelType"\"": "\""john"\"", "\""resource"\"": "\""doe"\"" }'"

相关问题