Mam poniższy skrypt, aby odjąć liczbę plików między dwoma katalogami, ale COUNT=
wyrażenie nie działa. Jaka jest poprawna składnia?
#!/usr/bin/env bash
FIRSTV=`ls -1 | wc -l`
cd ..
SECONDV=`ls -1 | wc -l`
COUNT=expr $FIRSTV-$SECONDV ## -> gives 'command not found' error
echo $COUNT
Odpowiedzi:
Potrzebujesz tylko trochę białych znaków wokół znaku minus i backticks:
Pamiętaj o statusie wyjścia:
Status wyjścia to 0, jeśli WYRAŻENIE nie jest ani zerowe, ani 0, 1, jeśli WYRAŻENIE jest zerowe lub 0 .
Należy o tym pamiętać, gdy używa się wyrażenia w skrypcie bash w połączeniu z zestawem -e, który zakończy działanie natychmiast, jeśli polecenie zakończy się z niezerowym statusem.
źródło
sh
powłoce posix . Aby uzyskać przenośność, możesz użyć tej odpowiedzi.Wypróbuj tę składnię Bash zamiast próbować używać zewnętrznego programu
expr
:BTW, poprawna składnia użycia
expr
to:Pamiętaj jednak, że używanie
expr
będzie wolniejsze niż wewnętrzna składnia Bash, którą podałem powyżej.źródło
$(command)
składnię do podstawiania poleceń. Również, ponieważ BASH obsługuje operacje arytmetyczne w$(( ... ))
tym, lepiej nie używać zewnętrznego narzędziaexpr
$(( ... ))
służy do oceny wyrażeń arytmetycznych.Możesz użyć:
aby uniknąć wywoływania osobnego procesu, zgodnie z poniższym zapisem:
źródło
Biała przestrzeń jest ważna,
expr
oczekuje argumentów i operatorów jako osobnych argumentów. Musisz także uchwycić wynik. Lubię to:ale częściej stosuje się wbudowane rozszerzenie arytmetyczne:
źródło
Oto jak zawsze wykonuję matematykę w Bash:
źródło
|bc
poleceniem typu, niż raz czy dwa. Mówią różne ruchy dla różnych ludzi.W przypadku prostej arytmetyki liczb całkowitych można również użyć wbudowanego polecenia let .
Aby uzyskać więcej informacji
let
, spójrz tutaj .źródło
let "sanity_check_duration=sanity_check_duration_end_time_delay_sec - sanity_check_duration_start_time_delay_sec"
(usuwając znak dolara ze zmiennych)Alternatywnie do sugerowanych 3 metod możesz wypróbować
let
operacje arytmetyczne na zmiennych w następujący sposób:let COUNT=$FIRSTV-$SECONDV
lub
let COUNT=FIRSTV-SECONDV
źródło
Użyj Pythona:
Wynik
źródło