Próbuję zbudować kilka skryptów dla początkujących za pomocą bash. Chcę dowiedzieć się, ile dni pozostało od dzisiaj do końca roku, korzystając z programu daty.
Więc używam zmiennej, bieżąca data = $ (data +% j), aby uzyskać numer dnia, który mamy teraz.
Jeśli powtórzę $ bieżąca data , otrzymam wynik 024 , jak zwykle się spodziewam, ponieważ mamy 24 stycznia.
Więc 365-024 czasy w lewo. I oto moje zapytanie. Robiąc obliczenia, powiedzmy calc 365-024 Otrzymuję wartość 345 zamiast 341 .
Co jest nie tak? Ma to coś wspólnego z zero na froncie ( 0 24), prawda?
bash-scripting
Skemelio
źródło
źródło
10#
np$((365-10#$current_date))
. Aby uzyskać dalszą dyskusję, zobacz to pytanie Przepełnienie stosu Skrypt Bash, nielegalny numer: 08Odpowiedzi:
Co jest nie tak? Ma to coś wspólnego z zero na froncie (024), prawda?
Tak. Znak wiodący
0
oznacza, że liczba jest interpretowana jako liczba ósemkowa (podstawa 8).Aby zinterpretować liczbę jako liczbę dziesiętną, użyj:
Aby uzyskać więcej informacji, zobacz jak wyłączyć interpretację liczb ósemkowych bash? (należy interpretować jako dziesiętny), który konkretnie rozwiązuje ten problem podczas wykonywania obliczeń za pomocą
date
.Stałe numeryczne
Source Advanced Bash-Scripting Guide - Stałe numeryczne
źródło
Wpisywanie liczb z wiodącym 0 jest konwencją dla notacji ósemkowej, podobnie jak przedrostek 0x oznacza szesnastkę. Więc 024 jest interpretowane jak 2 * 8 + 4 == 20. Zobacz wynik polecenia:
Usuń wiodące zera za pomocą przykładów kodu z kodu @ steeldriver w komentarzu poniżej.
źródło
sed
tutaj: użyj formatu daty,%-j
aby wyeliminować dopełnianie zera u źródła, użyj jawnej podstawy w powłoce10#$current_date
lub usuń wiodące zero za pomocą podstawienia parametrów${current_date#0}