2013-12-24 2 views
8

У меня есть папка с 3 фиктивными файлами: ab0, ab1 и ab2.Поведение Я не понимаю в bash

$ echo ab* 
ab0 ab1 ab2 

$ myvariable=ab* 
$ echo $myvariable 
ab0 ab1 ab2 

$ echo 'ab*' 
ab* 

До сих пор, я думаю, я понимаю. Но:

$ myvariable='ab*' 
$ echo $myvariable 
ab0 ab1 ab2 

Я ожидал ab*. Это означает, что есть основа, которую я не понимаю.

Я искал одиночные или двойные кавычки, расширения и многое другое в учебных пособиях и руководствах по bash, но я пока не понимаю.

+1

Также попробуйте 'эхо«$ MYVARIABLE»' – shoover

+0

Это может помочь вам понять: http://wiki.bash-hackers.org/syntax/расширение/интро – Mat

ответ

7

Строка $ echo $myvariable анализируется путем первой подстановки содержания $myvariable в строку, а затем выполняется строка. Поэтому, когда строка анализируется bash, она выглядит как $ echo ab*.

Если вы $ echo "$myvariable", вы получите требуемое поведение.

2

BASH не выполняет расширение во время назначения, его расширяется при запуске команды echo. Таким образом, при использовании обоих типов котировок вы сохраняете необработанную строку ab* вашей переменной. Чтобы увидеть это поведение в действии, используйте кавычки, когда вы echo, а также:

hephaestus:foo james$ echo ab* 
ab0 ab1 ab2 
hephaestus:foo james$ var=ab* 
hephaestus:foo james$ echo $var 
ab0 ab1 ab2 
hephaestus:foo james$ echo "$var" 
ab* 
hephaestus:foo james$ var='ab*' 
hephaestus:foo james$ echo $var 
ab0 ab1 ab2 
hephaestus:foo james$ echo "$var" 
ab* 
hephaestus:foo james$ 
Смежные вопросы