2016-01-23 21 views
1
bktitle="Bash" 
echo "New book title '$bktitle' added successfully!" 

我以为单引号使所有的字面意思?但是,这是给的理解bash逻辑。 (运营商和报价)

New Book title Bash added successfully! 
egrep ^[0-9]+$ 

为什么会这样行只接受整数输出?我知道^是用于开始的,+表示前面必须至少出现一次。但据我所知$,我不确定。它会不会接受像1a这样的东西?

egrep ^[0-9]+[.][0-9][0-9] 

为什么这行只能接受小数点后两位小数?我认为+只会允许它确保起始号码必须是0-9。那为什么它不接受像1a.00这样的东西?

+0

它与bash无关.. –

+0

这不是bash语言吗? –

回答

0

我以为单引号使一切都按字面?但这是给出New Book title 'BASH' added successfully的输出。

在您的例子:

bktitle="BASH" 
echo "New book title '$bktitle' added successfully!" 

内使用双引号字符串(""),单引号('')不解释,但变量。

如果你这样做:

bktitle="BASH" 
echo 'New book title \'$bktitle\' added successfully!' 

或者这样:

bktitle="BASH" 
echo "New book title \'$bktitle\' added successfully!" 

或者这样:

bktitle="BASH" 
echo 'New book title $bktitle added successfully!' 

你会看到(在头两个例子):

New book title '$bktitle' added successfully!

或者:

New book title $bktitle added successfully!

单引号不解释变量或双引号(或\escape sequences)。

为什么这行只接受整数?我知道这^是开始,+是为了意味着前面必须至少发生一次..但我的知识$我不知道。但它会不会接受像1a

你说得对^+[0-9]匹配0到9之间的任何数字。$表示结尾 - 与,并表示字符串的结尾。

^[0-9]+$ 

匹配任何包含一个或多个数字的字符串,从头到尾,没有别的。

现在你的最后一个问题:

egrep '^[0-9]+[.][0-9][0-9]' 为什么会这样行只接受小数整整2位小数?我认为+只会允许它确保起始数字必须是0-9。那为什么不接受像1a.00这样的东西?

是的,这将会匹配包含正好两位小数的十进制数。

如果你想让它接受字母为好,只要它以数字开头,你需要:

egrep '^[0-9][0-9a-z]+[.][0-9][0-9]' 

[0-9a-z]任意数量的0-9,以及任何字母A-Z匹配。

+0

如果单引号没有用双引号解释, bktitle =“BASH” echo“新书标题$ bktitle添加成功!” 所以当你说$匹配字符串的结尾?它是否意味着字符串的最后一个字符?或者当你像这样使用它时,“^ [0-9] + $”意味着从0-9开始,并且必须至少出现一次并以它结束? –

1
  1. "New book title '$bktitle' added successfully!"是一个双引号字符串,恰好包含一些单引号。如果您想查看字面文本'$bktitle',可以使用:"New book title '"'$bktitle'"' added successfully!",它是3个字符串(两个双引号(其中一个以单引号结尾,其中一个以单引号开头)和一个单引号)连接在一起。

  2. $匹配行结束。

  3. 1a.00不匹配,因为它是行后面跟着数字的三位数,并以文字.“的形式,开始不但是,这将匹配^[0-9]+[a][.][0-9][0-9],例如。

+0

感谢您的解释。 1.但我认为单引号会显示字面文字?正如我所发布的所有代码所做的正是我想要的,但我不明白其背后的逻辑。 2.所以既然$匹配行,“1a1”会成功? 3.但是这并不意味着前面的0-9应该至少出现一次,后面跟着一个。和两位小数位数字。那么为什么1a.00不匹配? –

+0

单引号将显示文字文本。但是,如果您将单引号放在双引号字符串中,那么您仍然有双引号字符串,并且插值了变量。否“1a1”包含[0-9]以外的字符,因此不匹配。 –