为什么bash脚本将单引号添加到带星号的字符串?

时间:2017-03-02 16:59:43

标签: bash

我正在尝试制作一个小脚本作为此命令的包装器:

$ egrep target /usr/lusers/me/test/*test.txt 
/usr/lusers/me/test/1test.txt:target

该目录包含名为1test.txt2test.txt的文件,其中一个文件包含我想要查找的文字。
这是我的整个脚本,名为mygrep.sh

set -v
set -x
egrep "$1" '/usr/lusers/me/test/*test.txt'

这是输出:

$ ./mygrep.sh target
set -x
egrep "$1" '/usr/lusers/me/test/*test.txt'
++ egrep targ '/usr/lusers/me/test/*test.txt'
egrep: /usr/lusers/me/test/*test.txt: No such file or directory

注意'输出中文件路径周围的set -x,命令失败。

现在比较脚本的这种变化:

set -v
set -x
egrep "$1" '/usr/lusers/me/test/1test.txt'

请注意,唯一的区别是星号与文字文件名 输出:

$ ./mygrep.sh target
set -x
egrep "$1" '/usr/lusers/me/test/1test.txt'
++ egrep target /usr/lusers/me/test/1test.txt
target

扩展后没有单引号,命令有效。

那么为什么在有星号的情况下会添加这些单引号,为什么在这种情况下命令失败?

2 个答案:

答案 0 :(得分:2)

randomstring = ShowConnString(self.cframe).connstringtext print(randomstring) self.conn = pypyodbc.connect(randomstring) #self.conn = pypyodbc.connect(driver='{SQL Server}', server='(local)', database='Audit', uid='sa', pwd='password') 产生的输出用于调试目的。参数中没有添加引号;它们仅用于显示目的。

正确的命令是set -x,因为在将结果传递给egrep "$1" /usr/lusers/me/test/*.test.txt之前,shell必须扩展模式(如果可能)。您没有名为egrep的实际文件。

答案 1 :(得分:1)

全局字符必须在引号外(单引号或双引号),因为引号禁用通配符。

请改用:

egrep "$1" '/usr/lusers/me/test/'*'test.txt'

或者这个:

egrep "$1" "/usr/lusers/me/test/"*"test.txt"

或者,因为这个特定模式中没有任何内容会导致单词分裂(但如果事先不知道路径,那么这通常不是一种安全的方法):

egrep "$1" /usr/lusers/me/test/*test.txt