这与宣传的一样:
# example 1
#!/bin/bash
grep -ir 'hello world' .
Run Code Online (Sandbox Code Playgroud)
这不是:
# example 2
#!/bin/bash
argumentString="-ir 'hello world'"
grep $argumentString .
Run Code Online (Sandbox Code Playgroud)
尽管'hello world'在第二个例子中被引号括起来,但grep解释'hello为一个参数和world'另一个参数,这意味着,在这种情况下,'hello将是搜索模式world'并将成为搜索路径.
同样,这仅在从argumentString变量扩展参数时发生.grep 'hello world'在第一个示例中正确解释为单个参数.
谁能解释为什么会这样?有没有一种正确的方法来扩展一个字符串变量,它将保留每个字符的语法,以便shell命令正确解释它?
我目前在从shell变量执行命令时遇到问题.
通常,以下工作符合预期:
COMMAND="echo A"
echo $COMMAND
$COMMAND
Run Code Online (Sandbox Code Playgroud)
生产:
echo A
A
Run Code Online (Sandbox Code Playgroud)
但如果我这样做
COMMAND="su aUser -s /bin/bash -c 'echo A'"
echo $COMMAND
$COMMAND
Run Code Online (Sandbox Code Playgroud)
我明白了
su aUser -s /bin/bash -c 'echo A'
Password:
A': -c: line 0: unexpected EOF while looking for matching `''
A': -c: line 1: syntax error: unexpected end of file
Run Code Online (Sandbox Code Playgroud)
如果我进入该行
su aUser -s /bin/bash -c 'echo A'
Run Code Online (Sandbox Code Playgroud)
直接按预期工作.
似乎我的假设是$ COMMAND等于输入内容,因为命令直接是错误的.
1)有谁知道如何从变量运行命令?
2)究竟有什么区别
COMMAND="command"
$COMMAND
Run Code Online (Sandbox Code Playgroud)
和
command
Run Code Online (Sandbox Code Playgroud)
?
我正在尝试执行使用预定义变量作为标头的 curl 命令。
header='-H "Content-Type: application/json" -H "userGUID: 7feb6e62-35da-4def-88e9-376e788ffd97" -H "Content-Length: 51"'
Run Code Online (Sandbox Code Playgroud)
这本质上是 curl 命令
curl $header -w "http code: %{http_code}\\n" -X POST -d $BODY $URL
Run Code Online (Sandbox Code Playgroud)
然后返回错误消息
rl: (6) Could not resolve host: application
curl: (6) Could not resolve host: 7feb6e62-35da-4def-88e9-376e788ffd97"
curl: (6) Could not resolve host: 51"
Run Code Online (Sandbox Code Playgroud)
这按预期工作
curl -H "Content-Type: application/json" -H "userGUID: 7feb6e62-35da-4def-88e9-376e788ffd97" -H "Content-Length: 51" -w "http code: %{http_code}\\n" -X POST -d $BODY $URL
Run Code Online (Sandbox Code Playgroud)
我试图将标头作为变量传递的原因是因为我正在编写一个循环遍历数组的脚本,但目前由于某种原因这不适用于标头。为 body 传递参数没有问题。