当前位置: 首页 > 面试题库 >

Bash在执行之前将引号插入字符串

詹亮
2023-03-14
问题内容

我设法在正在处理的init脚本中完成了一个奇怪的问题。在下面的示例中,我将问题简化了:

> set -x                           # <--- Make Bash show the commands it runs
> cmd="echo \"hello this is a test\""
+ cmd='echo "hello this is a test"'
> $cmd
+ echo '"hello' this is a 'test"'  # <--- Where have the single quotes come from?
"hello this is a test"

bash为什么要在执行的命令中插入那些多余的单引号?

在上面的示例中,多余的引号不会引起任何问题,但是它们确实让我头疼。

出于好奇,实际的问题代码为:

cmd="start-stop-daemon --start $DAEMON_OPTS \
    --quiet \
    --oknodo \
    --background \
    --make-pidfile \
    $* \
    --pidfile $CELERYD_PID_FILE
    --exec /bin/su -- -c \"$CELERYD $CELERYD_OPTS\" - $CELERYD_USER"

产生此结果:

start-stop-daemon --start --chdir /home/continuous/ci --quiet --oknodo --make-pidfile --pidfile /var/run/celeryd.pid --exec /bin/su -- -c '"/home/continuous/ci/manage.py' celeryd -f /var/log/celeryd.log -l 'INFO"' - continuous

因此:

/bin/su: invalid option -- 'f'

注意:我在su这里使用命令,因为我需要确保在运行celeryd之前已设置用户的virtualenv。--chuid不会提供这个


问题答案:

因为当您尝试执行命令时

$cmd

仅发生一层扩展。 $cmdcontains echo "hello this is a test",它扩展为6个以空格分隔的标记:

  1. echo
  2. "hello
  3. this
  4. is
  5. a
  6. test"

这就是set -x输出显示的内容:它将单引号括在包含双引号的标记周围,以明确各个标记的含义。

如果要$cmd扩展为一个字符串,然后再次应用所有bash引用规则,请尝试使用以下命令执行命令:

bash -c "$cmd"

或(如@bitmask在注释中指出,这可能更有效)

eval "$cmd"

而不只是

$cmd


 类似资料:
  • 问题内容: 我想像这样在Bash中显示一个字符串 当然可以这样 但是如何在字符串周围使用单引号的同时完成此操作? 问题答案: 不起作用。但是以下工作原理: 在bash的手册页中: 即使在单引号之前加反斜杠,也不能在单引号之间引起单引号。 .... $’string’* 形式的单词经过特殊处理。该单词扩展为字符串,并按ANSI C标准的规定替换反斜杠转义字符。 *

  • 本文向大家介绍groovy 双引号字符串(插值),包括了groovy 双引号字符串(插值)的使用技巧和注意事项,需要的朋友参考一下 示例 默认情况下会急切解析该参数,这意味着适用: 为了在每次使用字符串时延迟加载参数,可以这样做:            

  • 问题内容: 如何在另一个字符串的特定索引处插入一个字符串? 假设我想在“ foo”之后插入“ bar”,我该如何实现? 我想到了,但必须有一个更简单,更直接的方法。 问题答案: 您可以将自己的原型制作为String。 Polyfill 例 编辑: 对其进行了修改,以确保它是一个绝对值。

  • 本文向大家介绍oracle插入字符串数据时字符串中有'单引号问题,包括了oracle插入字符串数据时字符串中有'单引号问题的使用技巧和注意事项,需要的朋友参考一下 使用insert into(field1,field2...) values('val1','val2'...)时,若值中有单引号时会报错。 处理方法:判断一下val1,val2中是否含有单引号,若含单引号,则将单引号'替换成两个单引号

  • 问题内容: 我想用Java初始化一个String,但是该字符串需要包含引号;例如:。我试着做: 但这不起作用。如何”在字符串中包含? 问题答案: 在Java中,你可以使用:

  • 问题内容: 我在使用java.text.MessageFormat对象时遇到问题。 我正在尝试创建SQL插入语句。问题是,当我做这样的事情时: 我得到这个的价值: 如您所见,问题在于用单引号引起来的任何目标位置都不会被参数替换。我已经尝试过使用像这样的双单引号和这样的转义字符:但它仍然给出相同的结果。 编辑:我忘了提到我也尝试过。结果是:。它保留了原始引号,但仍未插入值。 我该如何解决这个问题?作