【问题标题】:What does *G* mean in bash echo?bash echo 中的 *G* 是什么意思?
【发布时间】:2013-03-24 13:10:52
【问题描述】:

不经常,但经常让我烦恼,当我将字符串 *G* 放入变量中并“回显”它时,我看到一些文件名,通常来自 BASH 所在目录中的文本文件尖。我认为这可能是一个自动完成功能,但在这些区域我找不到任何东西。有人能告诉我当我用这种字符组合回显一个字符串时发生了什么吗?如果可以的话,我想“关闭它”。

【问题讨论】:

  • * 在通配时为 0 个或多个字符。

标签: string bash replace echo


【解决方案1】:

这是一个通配符文件名,*G* 仅表示任意数量的字符(零个或多个)后跟 G 后跟任意数量的字符。

换句话说,任何带有G 的文件名。如果 no 文件中包含 Gbash 只会根据以下脚本为您提供原始字符串:

pax> mkdir qqq ; cd qqq ; touch paxfile

pax> ls -al
total 0
-rw-r--r-- 1 pax pax 0 Apr  3 10:05 paxfile

pax> echo *x*
paxfile

pax> echo *G*
*G*

您可以将其关闭,只需阻止外壳扩展文件名即可:

pax> echo '*x*'
*x*

另外,bash 有一个 GLOBIGNORE 变量,它包含一个以冒号分隔的文件名列表,您希望扩展这些文件名,因此您也可以使用它,尽管设置对于任意目录来说它是相当痛苦的(而且,是的,下面的方法不适用于嵌入空格的文件,所以在你抱怨之前,它仅用于演示目的):

pax> GLOBIGNORE=pax

pax> echo *x*
*x*

pax> touch xyzzy twisty ; unset GLOBIGNORE ; GLOBIGNORE=$(echo *x* | tr ' ' ':')

pax> echo $GLOBIGNORE == * # only twisty should expand here (no x)
paxfile:xyzzy == twisty

【讨论】:

  • 当然,单引号得到纯文本。我自己应该想到的。感谢 paxdiablo、Keith Thompson 和 alex。感谢 Pumbaa80 对我的 OQ 进行了编辑。 BZT
【解决方案2】:

这是一个通配符,将当前目录中的所有文件与名称中的字符 G 匹配。

Bash Reference Manualthis section 中有解释。

如果你真的想禁用它,你可以使用:

set -f

set -o noglob

如解释here

但这是一个非常有用的功能,我鼓励您保持启用状态并学习使用它。

如果你想为单个命令关闭它,你可以用引号或反斜杠转义任何特殊字符:

echo '*G*'
echo "*G*"
echo \*G\*

顺便说一下,此功能并非特定于echo 命令;它适用于 shell 中的 all 命令。例如:

ls *.txt

为您提供名称以.txt 结尾的所有文件的目录列表。

【讨论】:

  • Keith - 我认为我不会“选择”noglob 选项。我碰巧经常在 ls 和其他命令中使用星号之类的字符串。我将坚持使用单引号或反斜杠方法。 BZT
  • @SilversleevesX:很好奇:如果你一直在使用通配符,你怎么不知道*G* 是什么意思?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-10-16
  • 1970-01-01
  • 2019-12-25
  • 2011-06-13
  • 2012-05-12
  • 1970-01-01
  • 2018-11-29
相关资源
最近更新 更多