【问题标题】:Why bash converting double quotes to single quotes?为什么 bash 将双引号转换为单引号?
【发布时间】:2016-11-23 06:47:27
【问题描述】:

我写了一个简单的测试脚本,代码如下

#!/bin/bash
CHM=test
NAME="user@test"
if ! grep -q test /etc/passwd
then
        useradd -s /bin/bash -m -d /home/test -c "${CHM} : ${NAME}" test
fi

但我在 bash 将我的 " 转换为 ' 示例输出时遇到问题

+ CHM=test
+ NAME=user@test
+ grep -q test /etc/passwd
+ useradd -s /bin/bash -m -d /home/test -c 'test : user@test' test
useradd: invalid comment 'test : user@test'

我不知道如何解决这个问题欢迎任何输入,尝试搜索但没有产生任何首选结果

操作系统:RHEL6 GNU bash,版本 4.1.2(1)-release (x86_64-redhat-linux-gnu 谢谢

【问题讨论】:

  • 您的要求是什么?您希望如何添加名称?
  • 如果你看到输出 useradd 命令将不接受 -c 'text' 它只接受 -c "text"
  • 无法在 Ubuntu 上重现。这是哪个操作系统?
  • 我正在使用 redhat 6,bash 版本 GNU bash,版本 4.1.2(1)-release (x86_64-redhat-linux-gnu
  • @Inian 尝试一下,但它也会导致语法不正确: + useradd -s /bin/bash -m -d /home/test -c '"test' : 'user@test"' test

标签: linux bash


【解决方案1】:

/etc/passwd 由 : 字符分隔,因此 useradd 拒绝评论。尝试删除评论中的:。

【讨论】:

    【解决方案2】:

    Bash 不会转换任何引号,这纯粹是set -x 的输出工件。如您所见,${VARIABLES} 已在 set -x 输出中扩展。之后,引号类型不再重要,bash 维护者选择在单引号中显示所有包含空格的单词,以使单词边界清晰。

    正如 codegrep_admin 正确识别的那样,实际问题是无法对 /etc/passwd 中的任何字段使用冒号 :。例如。你不能有一个名为foo:bar的用户,你不能有一个评论说test:user@test,你不能有一个名为ba:sh的shell。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-12-28
      • 2018-11-18
      • 2017-06-19
      • 1970-01-01
      • 1970-01-01
      • 2017-12-29
      • 1970-01-01
      相关资源
      最近更新 更多