Patrzę na skrypt, który ma:
if [ "${PS1-}" ]; then
To ostatnie -
mnie trochę wkurza, ponieważ wydaje się, że nie jest to standardowa składnia Posix lub Bash. To jakaś tajemnicza składnia, która istnieje od zawsze, czy to literówka? Wszelkie odniesienia do standardów / dokumentów będą mile widziane.
Normalnie kodowałbym to:
if [ "$PS1" ]; then
Co jest bardziej poprawne, czy jest między nimi różnica?
zsh
jest jedyną znaną mi powłoką, która wyraźnie wspomina o wariantach wolnych od okrężnicy, a nie tylko odnotowuje, co robi pominięcie okrężnicy.Rozwinięcie zmiennej
${parameter:-word}
wykorzysta wartość$parameter
if, jeśli jest ustawiona i różna od null (nie jest pustym łańcuchem), w przeciwnym razie użyje łańcuchaword
.Pominięcie tej opcji
:
nie sprawdzi, czy wartość jest pusta, tylko czy jest nieustawiona, czy nie.Oznacza to, że
${PS1-}
rozwinie się do wartości,$PS1
jeśli jest ustawiona, ale do pustego ciągu, jeśli jest pusta lub rozbrojona. W tym przypadku jest to dokładnie to samo, co${PS1:-}
ciąg po-
jest również pusty.Różnica między
"${PS1-}"
i"$PS1"
jest subtelna, jak zauważa @Rakesh Sharma: oba rozwiną się do wartości$PS1
lub do pustego ciągu, jeśli nie jest ustawiony. Wyjątkiem jest to, kiedyset -u
jest aktywny, w którym to przypadku rozwinięcie nieuzbrojonych zmiennych spowoduje błąd . Ustawiona przez (pusta) wartość domyślna pozwala"${PS1-}"
to obejść, rozszerzając unsetPS1
do pustego ciągu bez błędu.Jest to standardowa składnia ( pochodząca z powłoki Bourne'a pod koniec lat 70. ), podobnie jak kilka innych podobnych rozszerzeń.
źródło
"$PS1"
, ponieważ jeśliPS1
jest pusty, jest pusty, a cytaty uniemożliwiają całkowite zniknięcie słowa.set -u
nie działa. Gdy opcja rzeczownika jest włączona, wówczas „$ PS1” => daje błąd. „$ {PS-}” nie będzie.${parameter:-word}
użyje wartości,$parameter
jeśli nie jest NULL. We wszystkich innych przypadkach (co oznacza: albo ustawione, ale NULL lub nieuzbrojone) użyjeword
. Twoje sformułowanie:if its set or null
set AND nonnull
=> użyj samego. W przeciwnym razie (set but NULL OR unset
) => użyj słowa.Składnia:
i specjalny formularz:
jest poprawną składnią w powłoce POSIX , oznacza użycie wartości domyślnej,
word
jeśliparameter
jest nieustawiona lub zerowa.Zwykle z
word
jest puste, a następnie:i:
lub:
są równoważne.
Ale pod wpływem
set -u
wszystkich nieustawionych zmiennych powoduje zakończenie powłoki.${parameter-}
służy do ominięcia tej ścisłej zasady. Działa w obu przypadkach, więc tak, jest to bardziej poprawny sposób.źródło