开发者

11*(...) as a bash parameter without quotation marks

I'm trying to write a small piece of code that passes a small formula to another program, however i've found that something strange happens when the 开发者_StackOverflowformula starts with 11*(:

$ echo 11*15

Neatly prints '11*15'

$ echo 21*(15)

Neatly prints '21*(15)', while

echo 11*(15)

Only gives '11'. As far as I've found this only happens with '11*('. I know that this can be solved by using proper quotation marks, but I'm still curious as to why this happens.

Does anyone know?


How is your program coded? If its coded to take in parameters, then pass your formula like

./myprogram "11*15"

or

echo '11*15' | myprogram

If you do echo just like that on the command line, you may inadvertently display files that has 11 in its file name


11*(15) uses a Bash-specific extended glob syntax. You've stumbled across it accidentally, emphasizing why quotation marks are a good idea. (I also learned a lot tracking down why it was working differently for me; thanks for that.)

The behavior of

echo 11*(15)

in bash is going to vary depending on whether extglob is enabled. If it's enabled *(PATTERN-LIST) matches zero or more occurrences of the patterns. If it's disabled, it doesn't, and the resulting ( is likely to cause a syntax error.

For example:

$ ls
11  115  1155  11555  115555
$ shopt -u extglob
$ echo 11*(55)
bash: syntax error near unexpected token `('
$ shopt -s extglob
$ echo 11*(55)
11 1155 115555
$

(This explains the odd behavior I discussed in comments.)

Quoting from the bash 4.2.8 documentation (info bash):

If the `extglob' shell option is enabled using the `shopt' builtin, several extended pattern matching operators are recognized. In the following description, a PATTERN-LIST is a list of one or more patterns separated by a `|'. Composite patterns may be formed using one or more of the following sub-patterns:

`?(PATTERN-LIST)' Matches zero or one occurrence of the given patterns.

`*(PATTERN-LIST)' Matches zero or more occurrences of the given patterns.

`+(PATTERN-LIST)' Matches one or more occurrences of the given patterns.

`@(PATTERN-LIST)' Matches one of the given patterns.

`!(PATTERN-LIST)' Matches anything except one of the given patterns.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜