AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / unix / 问题 / 446388
Accepted
Alexander Mills
Alexander Mills
Asked: 2018-05-28 19:54:21 +0800 CST2018-05-28 19:54:21 +0800 CST 2018-05-28 19:54:21 +0800 CST

反引号与双引号

  • 772

这个问题想了好久,一直不知道怎么查

这是:

x=`command -v r2g`

与此相同:

x="$(command -v r2g)"

还是和这个一样:

x=$(command -v r2g)

...如果是后者,我应该这样做来解决它吗?

x="`command -v r2g`"
shell-script syntax
  • 4 4 个回答
  • 3395 Views

4 个回答

  • Voted
  1. Best Answer
    Sergiy Kolodyazhnyy
    2018-05-28T21:06:12+08:002018-05-28T21:06:12+08:00

    所有示例都是命令替换的变量赋值,因此它们是等价的。根据Gilles 的回答,在分配给变量的右手边不需要引用,因为那里不会发生分词。所以四个都OK。

    如果它们是独立的,即不在分配中,那么您需要引用。与反引号相比,这种 $(...)形式的优点是引号可以嵌套并分成多行,这就是为什么现在这种形式普遍受到青睐的原因。换句话说,您可以"$( echo "$var" )" 使用这种形式来保护内部扩展$var和外部扩展$(...)免受分词和文件名通配符的影响。

    如POSIX Shell 命令语言规范所示,嵌入式多行脚本不能使用反引号(左侧),但可以使用$()表单(右侧)。

    echo `                         echo $(
    cat <<\eof                     cat <<\eof
    a here-doc with `              a here-doc with )
    eof                            eof
    `                              )
    
    
    echo `                         echo $(
    echo abc # a comment with `    echo abc # a comment with )
    `                              )
    
    
    echo `                         echo $(
    echo '`'                       echo ')'
    `                              )
    
    • 9
  2. user232326
    2018-05-28T21:45:35+08:002018-05-28T21:45:35+08:00

    这四个示例在功能上是等效的。

    反引号已过时,除非您使用 1970 年的 shell,如 Bourne shell(如 Heirloom),否则您不需要它们。主要问题是它们很难嵌套,试试:

    $ echo $(uname | $(echo cat))
    Linux
    
    $ echo `uname | `echo cat``
    bash: command substitution: line 2: syntax error: unexpected end of file
    echo cat
    

    在只有一个赋值的命令行的右侧,引用扩展是不必要的(但无害的),因为无论如何都认为扩展被引用:

    $ var=$(uname)
    

    但这并不总是正确的,命令 export 上的赋值被视为一个参数,并且将在某些 shell(不是在 bash 中)中被拆分和全局化:

    $ dash -c 'export MYVAR=`echo a test`;echo "$MYVAR"'
    a
    

    相同的推理适用于local(局部变量赋值需要引号吗?)和declare(以及其他一些)。

    你应该做的“修复它”是:

    x=$(command -v r2g)
    

    有时(对于可移植脚本):

    export x="$(command -v r2g)"
    
    • 4
  3. Alexander
    2018-05-28T20:08:28+08:002018-05-28T20:08:28+08:00

    是的,还应该引用反引号。

    对于命令输出不包含空格的情况,这可能是首选 bash 样式的问题。shellharden这是该实用程序作者的引述,来自“如何在 bash 中安全地做事”:

    Should I use backticks?
    Command substitutions also come in this form:
    
    Correct: "`cmd`"
    Bad: `cmd`
    While it is possible to use this style correctly, it looks even more awkward in quotes and is less readable when nested. The consensus around this one is pretty clear: Avoid.
    
    Shellharden rewrites these into the dollar-parenthesis form.
    

    我也相信用 引用反引号"或(更好)重写它以使用$(). 如果在使用反引号时命令输出包含空格或特殊字符,如果不引用表达式可能会出现问题。

    • 3
  4. Alexander Mills
    2018-05-28T20:25:18+08:002018-05-28T20:25:18+08:00

    是的,根据这份文件,我的猜测看起来是正确的: https ://github.com/anordal/shellharden/blob/master/how_to_do_things_safely_in_bash.md

    它说:

    # Should I use backticks?
    # Command substitutions also come in this form:
    
    Correct: "`cmd`"
    Bad: `cmd`
    
    • 0

相关问题

  • 在awk中的两行之间减去相同的列

  • 打印文件行及其长度的脚本[关闭]

  • 通过命令的标准输出以编程方式导出环境变量[重复]

  • 按分隔符拆分并连接字符串问题

  • MySQL Select with function IN () with bash array

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    如何将 GPG 私钥和公钥导出到文件

    • 4 个回答
  • Marko Smith

    ssh 无法协商:“找不到匹配的密码”,正在拒绝 cbc

    • 4 个回答
  • Marko Smith

    我们如何运行存储在变量中的命令?

    • 5 个回答
  • Marko Smith

    如何配置 systemd-resolved 和 systemd-networkd 以使用本地 DNS 服务器来解析本地域和远程 DNS 服务器来解析远程域?

    • 3 个回答
  • Marko Smith

    如何卸载内核模块“nvidia-drm”?

    • 13 个回答
  • Marko Smith

    dist-upgrade 后 Kali Linux 中的 apt-get update 错误 [重复]

    • 2 个回答
  • Marko Smith

    如何从 systemctl 服务日志中查看最新的 x 行

    • 5 个回答
  • Marko Smith

    Nano - 跳转到文件末尾

    • 8 个回答
  • Marko Smith

    grub 错误:你需要先加载内核

    • 4 个回答
  • Marko Smith

    如何下载软件包而不是使用 apt-get 命令安装它?

    • 7 个回答
  • Martin Hope
    rocky 如何将 GPG 私钥和公钥导出到文件 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Wong Jia Hau ssh-add 返回:“连接代理时出错:没有这样的文件或目录” 2018-08-24 23:28:13 +0800 CST
  • Martin Hope
    Evan Carroll systemctl 状态显示:“状态:降级” 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim 我们如何运行存储在变量中的命令? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S 为什么 /dev/null 是一个文件?为什么它的功能不作为一个简单的程序来实现? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 如何从 systemctl 服务日志中查看最新的 x 行 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - 跳转到文件末尾 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla 为什么真假这么大? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis 在一个巨大的(70GB)、一行、文本文件中替换字符串 2017-12-30 06:58:33 +0800 CST
  • Martin Hope
    Bagas Sanjaya 为什么 Linux 使用 LF 作为换行符? 2017-12-20 05:48:21 +0800 CST

热门标签

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve