这与宣传的一样:
# 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命令正确解释它?
我生成一个包含所有args的bash变量,这些args包含空格.当我用这些args启动命令时 - 例如.ls $ args - 引号未正确解释.这是一个示例 - 还创建和擦除所需的文件.
#!/bin/bash
f1="file n1"
f2="file n2"
# create files
touch "$f1" "$f2"
# concatenate arguments
args="\"$f1\" \"$f2\""
# Print arguments, then launch 'ls' command
echo "arguments :" $args
ls $args
# delete files
rm "$f1" "$f2"
Run Code Online (Sandbox Code Playgroud)
有了这个,我对"file,n1","file and n2"有一些"没有这样的文件"错误
我有一个命令,我用来获取hostname.localdomain
dig axfr @dc1.localdomain.com localdomain.com | grep -i Lawler | awk '{ getline ; $1=substr($1,1,length($1)-1); print $1 ; exit }'
Run Code Online (Sandbox Code Playgroud)
这很好地返回一个结果,如:
michael.lawler.localdomain.com
我想进一步将该结果用作bash脚本中的变量.
我似乎无法越过第一个管道.
如果我 VAR="dig axfr @dc1.localdomain.com localdomain.com | grep -i Lawler | awk '{ getline ; $1=substr($1,1,length($1)-1); print $1 ; exit }'"
...我回到整个区域转移.我也尝试$过在dig命令之前添加许多小改动,没有引号,似乎没有任何效果.任何方向都非常感谢.
我有一个带有以下内容的file1.txt:
time="2016-04-25T17:43:11Z" level=info msg="SHA1 Fingerprint=9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F"
Run Code Online (Sandbox Code Playgroud)
我希望文件看起来如下:
9F:AD:D4:FD:22:24:20:A2:1E:0C:7F:D0:19:C5:80:42:66:56:AC:6F
Run Code Online (Sandbox Code Playgroud)
实际上,我需要将命令作为字符串传递.这就是为什么bash命令需要封装在带双引号的字符串中的原因.但是,当我包括
" grep -Po '(?<=Fingerprint=)[^"]*' "
Run Code Online (Sandbox Code Playgroud)
我没有得到所需的输出.似乎我需要正确地逃避双引号.