@ShivanRaptor Chociaż można by argumentować, że jest to kwestia RTFM, z pewnością jest to poprawne pytanie dotyczące programowania powłoki. Jest to również rozsądne pytanie dla kogoś pochodzącego z języków, które nie wymagają dereferencji (np. Ruby lub JavaScript). Powinien pozostać otwarty.
Todd A. Jacobs
6
@ShivanRaptor Nie, to jest temat tutaj. Chodzi o programowanie w Bash. Unix / Linux służy głównie do korzystania z systemu, a nie do programowania. Otóż, skrypty powłoki wykraczają poza granice między programowaniem a używaniem systemu, więc może to być tematem w obu witrynach. Gdyby pojawiło się pytanie „jak skonfigurować sieć”, z pewnością pasowałoby to w systemie Unix / Linux. Gdyby chodziło o interaktywne skróty klawiszowe w Bash, to też by tu pasowało. Ale pytanie o skrypty powłoki jest zdecydowanie tematem zarówno tutaj, jak i tam.
Brian Campbell
Zobacz moją odpowiedź tutaj, która ilustruje odejmowanie i dzielenie zmiennych $ BASH, używając wywołania Pythona z powłoki (aby przekonwertować int na float ...): stackoverflow.com/questions/8385627/…
Victoria Stuart
Odpowiedzi:
195
Te zmienne są zmiennymi powłoki. Aby rozwinąć je jako parametry do innego programu ( tj.expr ), Musisz użyć $przedrostka:
expr $x / $y
Narzekał, ponieważ sądził, że próbujesz operować na znakach alfabetycznych ( tj. Nie-całkowitych)
Jeśli używasz powłoki Bash, możesz osiągnąć ten sam wynik, używając składni wyrażenia:
Dlaczego nie skorzystać z let; Uważam to za dużo łatwiejsze. Oto przykład, który może okazać się przydatny:
start=`date +%s`# ... do something that takes a while ...
sleep 71
end=`date +%s`
let deltatime=end-start
let hours=deltatime/3600
let minutes=(deltatime/60)%60
let seconds=deltatime%60
printf "Time spent: %d:%02d:%02d\n" $hours $minutes $seconds
Kolejny prosty przykład - oblicz liczbę dni od 1970 roku:
Odwoływanie się do zmiennych Bash wymaga rozszerzenia parametrów
Domyślną powłoką w większości dystrybucji Linuksa jest Bash. W Bash zmienne muszą używać przedrostka w postaci znaku dolara do rozwijania parametrów . Na przykład:
x=20
y=5
expr $x / $y
Oczywiście Bash ma również operatory arytmetyczne i specjalną składnię interpretacji arytmetycznej , więc nie ma potrzeby wywoływania pliku binarnego wyrażenia jako oddzielnego procesu. Możesz pozwolić powłoce wykonać całą pracę w ten sposób:
Nie ma to nic wspólnego z dereferencją, ale interpolacją i exprjest odradzane w 2013 roku.
Gilles Quenot
@sputnick Jesteś wyraźnie zdezorientowany. Zachęcamy do skorzystania ze słownika. Zobacz wyłuskiwanie i interpolacja .
Todd A. Jacobs
1
Lepsze słowo to rozszerzenie , ale nie wyłuskiwanie . dereferencja jest używana, gdy używamy wskaźników , tak nie jest w tym przypadku, to tylko proste zmienne.
Gilles Quenot
1
@Prashant: tldp nie jest dobrym odniesieniem w świecie bash.
Gilles Quenot
1
Załóżmy, że
x=50
y=5
następnie
z=$((x/y))
to będzie działać poprawnie. Ale jeśli chcesz użyć operatora / w przypadku instrukcji, nie może tego rozwiązać.
W takim przypadku użyj prostych łańcuchów, takich jak div, divide lub coś innego. Zobacz kod
To jest źle. /działa dobrze jako etykieta typu shell-case. To, co nie działa, to *mnożenie bez cytowania, co może być tym, co faktycznie zrobiłeś; to powoduje, że skutecznie zastępuje wszystkie następujące elementy w przypadku, które w twoim przykładzie to „devide” i „modulo”
dave_thompson_085
0
Aby uzyskać liczby po przecinku, możesz to zrobić: -
Odpowiedzi:
Te zmienne są zmiennymi powłoki. Aby rozwinąć je jako parametry do innego programu ( tj.
expr
), Musisz użyć$
przedrostka:Narzekał, ponieważ sądził, że próbujesz operować na znakach alfabetycznych ( tj. Nie-całkowitych)
Jeśli używasz powłoki Bash, możesz osiągnąć ten sam wynik, używając składni wyrażenia:
Lub:
źródło
man bash
po znaku zachęty (q
aby wyjść)Myślę, że wspomniano już o tym w innych wątkach:
możesz po prostu wpisać:
W Twoim przypadku będzie to:
lub jeśli wolisz, dodaj to jako oddzielny skrypt i udostępnij w $ PATH, aby zawsze mieć go w swojej lokalnej powłoce:
źródło
echo '1 / 3' | bc -l
Dlaczego nie skorzystać z let; Uważam to za dużo łatwiejsze. Oto przykład, który może okazać się przydatny:
Kolejny prosty przykład - oblicz liczbę dni od 1970 roku:
źródło
Odwoływanie się do zmiennych Bash wymaga rozszerzenia parametrów
Domyślną powłoką w większości dystrybucji Linuksa jest Bash. W Bash zmienne muszą używać przedrostka w postaci znaku dolara do rozwijania parametrów . Na przykład:
Oczywiście Bash ma również operatory arytmetyczne i specjalną składnię interpretacji arytmetycznej , więc nie ma potrzeby wywoływania pliku binarnego wyrażenia jako oddzielnego procesu. Możesz pozwolić powłoce wykonać całą pracę w ten sposób:
źródło
expr
jest odradzane w 2013 roku.Załóżmy, że
następnie
to będzie działać poprawnie. Ale jeśli chcesz użyć operatora / w przypadku instrukcji, nie może tego rozwiązać. W takim przypadku użyj prostych łańcuchów, takich jak div, divide lub coś innego. Zobacz kod
źródło
/
działa dobrze jako etykieta typu shell-case. To, co nie działa, to*
mnożenie bez cytowania, co może być tym, co faktycznie zrobiłeś; to powoduje, że skutecznie zastępuje wszystkie następujące elementy w przypadku, które w twoim przykładzie to „devide” i „modulo”Aby uzyskać liczby po przecinku, możesz to zrobić: -
źródło