2013-01-18 8 views
13

To bardzo ciekawe, że jeśli masz zamiar wyświetlać jak „0_1” z bash przy użyciu kodu

x=0 
y=1 
echo "$x_$y" 

następnie zostanie wyłącznie

1 

Próbowałem echo "$x\_$y" i to nie działa.

Moje pytanie brzmi: jak wyświetlić formularz $ x_ $ y? Zamierzam użyć go na łańcuchu nazwy pliku.

+0

Włącz kolorowanie składni w vim. Natychmiast dostrzeżesz proste błędy. – Dariusz

Odpowiedz

23

Ponieważ nazwy zmiennych mogą mieć podkreślenia w nim polecenie:

echo "$x_$y" 

próbuje echo ${x_} (co jest p automatycznie pusty w twoim przypadku), a następnie ${y}. Powodem tego jest to, że rozszerzenie parametrów jest chciwą operacją - po nazwie $ będzie przyjmować tyle znaków prawnych, ile jest możliwe, aby utworzyć nazwę zmiennej.

Odpowiednia część bash stanach podręcznika:

$ postać wprowadza dopełniania parametrów, podmian poleceń lub arytmetycznego.

Nazwa parametru lub symbol do rozwinięcia może być ujęta w nawiasy klamrowe, które są opcjonalne, ale służą do ochrony zmiennej, która ma zostać rozwinięta, od znaków bezpośrednio za nią, które mogą być interpretowane jako część nazwy.

Gdy stosuje się szelki, dopasowanie kończy usztywnienie jest pierwszym } nie uciec przez backslashem lub w cudzysłowach, a nie w osadzonym arytmetycznego, zastąpienie polecenia lub ekspansji parametrów.

Stąd rozwiązanie ma na celu zapewnienie, że _ jest nie traktowane jako część pierwszej zmiennej, która może być wykonana z:

echo "${x}_${y}" 

staram się robić wszystko moje bash takie zmienne, nawet autonomiczne, takie jak:

echo "${x}" 

ponieważ jest bardziej wyraźny i zostałem ugryziony tak wiele razy mes w przeszłości :-)

+0

Użycie dobrego edytora tekstu z podświetlaniem składni pomaga immersyjnie wykrywać takie zakłócenia bez zaśmiecania całego kodu z jawnym '$ {x}' notacja. – GreyCat

11

ten sposób:

$ echo "${x}_${y}" 
0_1 
8

owinąć je w nawiasach klamrowych:

echo "${x}_${y}"

+0

Ktoś wie, dlaczego bash tak się zachowuje ?. 'echo" $ x. $ y "'. Z 'kropką' to działa. – Suku

+6

ponieważ zmienne mogą zawierać w sobie podkreślenia, ale nie kropki - z podkreśleniami uważa się, że masz zmienne zwane '$ x_' i' $ y'. ale z kropkami nie będzie się mylić –

+1

nazwy zmiennych nie mogą mieć kropek, wartości mogą mieć dowolne wartości –

5

Wystarczy do tego trendu, można też to zrobić:

echo $x'_'$y 

Możesz być notowane i nienotowane części obok siebie bez przestrzeni pomiędzy nimi.A ponieważ ' nie jest legalnym znakiem nazwy zmiennej, bash zastąpi tylko $x. :)

+0

to nie działa w moim przypadku –

+0

@ tomriddle_1234: W jaki sposób to nie działa? Jeśli dołączysz argument do echa w podwójnych cudzysłowach, to nie zadziała, ale polecenie zostało napisane bez podwójnego cudzysłowu z jakiegoś powodu. –

+2

I inny sposób radzenia sobie z tym: 'x = 0; y = 1; z = _; echo "$ x $ z $ y"; ' –

Powiązane problemy