linux - 使用双引号执行 Linux 命令

标签 linux command-line ksh quotes

所以我想弄清楚这种奇怪的行为。

$ hello hello           
-ksh: hello: not found [No such file or directory]
$ "hello hello"
-ksh: hello hello: not found [No such file or directory]
$ echo hello hello
hello hello
$ `echo hello hello`
-ksh: hello: not found [No such file or directory]
$ echo \"hello hello\"
"hello hello"
$ `echo \"hello hello\"`
-ksh: "hello: not found [No such file or directory]

第二条和第六条命令与我的问题最相关。如果我运行第二个命令 "hello hello",那么它会将其评估为一个大参数。但是,如果我尝试运行最后一条命令

`echo \"hello hello\"`

那么它应该有相同的行为吗?但是它将 "hello 视为它自己的独立词。有人可以解释一下吗?我如何让第 6 个命令像第二个命令一样工作,这样它将 "hello hello"作为一个完整的语句进行评估?

(这有一个更实际的应用,但这是我能制作的最小示例)。

提前致谢!

编辑:我看到我得到了反对票,所以我会更具体地说明我遇到的问题。

rcli4 6379 keys AAA* | sed -e "s/.*/'&'/" | while read line; do rcli4 6379 get $line; done

注意 rcli4 只是 redis-cli -p 的别名。我不断得到一个

(error) ERR wrong number of arguments for 'get' command

这是由于引号解析错误造成的。我尝试了不同的组合,例如添加更多引号、删除 sed 语句等,但都无济于事,但我认为能够解决我最初的 hello hello 问题将使我对如何解决我的特定问题有足够的了解。

最佳答案

在带引号的字符串中,引号只是另一个字符。它没有特殊的力量。

如果我正确理解编辑中所述的问题,解决方案是在 do 循环中引用 $line 内部,而不是在它之前。因此,尝试:

rcli4 6379 keys 'AAA*' | while read -r line; do rcli4 6379 get "$line"; done

如果 $line 没有双引号,shell 将对 line< 的内容执行分词路径名扩展/。你也不想要。双引号抑制两者。

此外,我们还向read 添加了-r 选项。这可以防止 readline 的内容进行反斜杠处理。

最后,我们在数据库键 glob AAA* 周围加上了单引号。如果没有引号,shell 会将 AAA* 解释为文件 glob,并对其执行路径名扩展。如果当前目录中恰好有文件与该 glob 匹配,结果将是意想不到的和不需要的。如果设置了 bash 选项 nullglob,则无论当前目录中有什么文件,结果都不是您想要的。

关于linux - 使用双引号执行 Linux 命令,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46186218/

相关文章:

c - 对 GLib 友好的 MD5 例程?

command-line - 如何在批处理文件中循环匹配通配符的文件

regex - 如何在 linux shell 中使用正则表达式从文件中提取 IP 地址?

linux - 如何在shell脚本中提取字符串

linux - fedora 29 Linux 上的二进制文件 "Eclipse C/C++ Stand-alone Debugger"在哪里

linux - Apache2 将 https 重定向到没有证书的 http

linux - 在 bash 中排序

java - 如何使用 JCommander 添加命令行参数依赖?

regex - 从 Unix 中的一行中提取字符串

bash - 是否有用于遍历相似目录结构的 Bash 快捷方式?