Mam ten skrypt powłoki, który nie działa.
Wejście:
Server_Name=1
if [ $Server_Name=1 ]; then
echo Server Name is 1
else
echo Server Name is not 1
fi
Wynik:
Server Name is 1
Ale jeśli zmienię Server_Name=2
, wynik będzie:
Server Name is 1
Kiedy zmieni Server_Name
się 2
, chcę powiedzieć: Server Name is 2
.
Wiem, że to if [ $Server_Name=1 ];
część.
Jak to naprawić?
linux
bash
shell
shell-script
użytkownik2649805
źródło
źródło
if [ ! "x$var" = "x" ]; then\n if [ $var -eq 1 ]; then ...
Odpowiedzi:
Twój skrypt wskazuje, że używasz porównań ciągów.
Załóżmy, że nazwa serwera może być ciągiem zamiast liczby.
Dla porównań ciągów :
if [[ "$Server_Name" == 1 ]]; then
Uwagi:
Odstęp wokół = jest koniecznością
if [ $Server_Name=1 ]; then
jest NIEPRAWIDŁOWY[[...]] zmniejsza liczbę błędów, ponieważ między [[a]] nie dochodzi do rozwijania nazw ani dzielenia wyrazów
Preferuj ciągi znaków, które są „słowami”
Dla porównań liczb całkowitych :
if [[ "$Server_Name" -eq 1 ]]; then
Więcej informacji:
źródło
[[
to składnia bash, a OP pytał o powłokę, w której to by nie działałoSpróbuj tego:
źródło
nie działa zgodnie z przeznaczeniem, ponieważ składnia w pojedynczych nawiasach nie jest wyjątkowa dla Bash. Jak zwykle zmienna
$Server_Name
zostaje podstawiona przez 1, więc wszystkie polecenia test ([
) są jednym argumentem: ciągiem znaków1=1
. Ponieważ żądło ma niezerową długość, test zwraca true .W przypadku powłok zgodnych z POSIX można użyć następujących poleceń testowych :
sprawdza, czy
$Server_Name
jest równy ciągowi1
.sprawdza, czy
$Server_Name
jest równe liczbie1
, tzn. dokonuje porównania numerycznego zamiast porównania ciągu.Zwracana wartość obu poleceń będzie się różnić, np. Jeśli zdefiniujesz
Server_Name=01
. Pierwszy zwróci fałsz, drugi zwróci prawdę.Zauważ, że jeśli istnieje możliwość, że zmienna
$Server_Name
jest niezdefiniowana, należy ją podać lub test wyświetli błąd po jej wywołaniu.źródło
Próbować,
wynik:
źródło
Prosta odpowiedź. Twój kod jest poprawny - prawie. jedyne, czego brakuje, to spacje ... (i może dodatkowe „=”)
nie będzie poprawnie obliczany.
jest tym, czego szukasz.
A teraz stwierdzenie o sznurku a liczbach. Ilekroć szukasz porównania takiego jak jest / nie jest, wtedy == zawsze będzie dobrze.
Zakładam, że zawsze masz nazwę serwera jako ciąg, a nie liczbę - prawda? ;-)
Powodzenia z solidnym uczniem kodującym.
cześć
źródło