C-shell变量中的花括号

  • 本文关键字:变量 C-shell curl csh
  • 更新时间 :
  • 英文 :


这真让我抓狂。我试图在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""" }'"

最新更新