这真让我抓狂。我试图在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
请帮助。
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是一个危险的命令。
要了解更多信息,我强烈推荐Using csh &tcsh由Paul DuBois编写。对于C-Shell是一个很好的参考。
双引号中的双引号应该用"""
转义;用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""" }'"