Próbuję zrozumieć skrypt testowy, który zawiera następujący fragment:
SCRIPT_PATH=${0%/*}
if [ "$0" != "$SCRIPT_PATH" ] && [ "$SCRIPT_PATH" != "" ]; then
cd $SCRIPT_PATH
fi
Co oznacza ${0%/*}
kandydowania? Dzięki
Próbuję zrozumieć skrypt testowy, który zawiera następujący fragment:
SCRIPT_PATH=${0%/*}
if [ "$0" != "$SCRIPT_PATH" ] && [ "$SCRIPT_PATH" != "" ]; then
cd $SCRIPT_PATH
fi
Co oznacza ${0%/*}
kandydowania? Dzięki
Nazywa się Parameter Expansion
. Spójrz na this page i resztę strony.
Co ${0%/*}
robi to, rozszerza wartość zawartego w argumentem 0 (która to ścieżka, która nazywa się skrypt) po usunięciu ciąg /*
przyrostek od końca.
Więc $0
jest taki sam jak ${0}
, który jest jak każdy inny argument, np. $1
, którą można zapisać jako ${1}
. Jak już powiedziałem, $0
jest wyjątkowy, ponieważ nie jest to argument prawdziwy, zawsze tam jest i reprezentuje nazwę skryptu. Rozszerzenie parametru działa w nawiasach klamrowych, a %
jest jednym z typów rozszerzenia parametrów.
%/*
dopasowuje ostatnie wystąpienie /
i usuwa wszystko (*
oznacza cokolwiek) po tej postaci. Spójrz na tym prostym przykładzie:
$ var="foo/bar/baz"
$ echo "$var"
foo/bar/baz
$ echo "${var}"
foo/bar/baz
$ echo "${var%/*}"
foo/bar
tak, to AA 'dirname ($ 0)' – jm666
w tym skrypcie, tak, to działa jak 'dirname "$ 0"', ale może to spowodować problemy. Jeśli wywołasz skrypt w ten sposób: 'skrypt bash' wtedy' $ {0/*} 'nie daje ci ścieżki, zwraca nazwę skryptu lub jeśli podałeś pełną ścieżkę (_/path/to/script_) to nic nie zwraca, więc nie gwarantuje się działania zgodnie z oczekiwaniami we wszystkich sytuacjach. – c00kiemon5ter
Byłem zajęty pisaniem pytania na superużytkownika o linii, która to ma, napisałem w moim pytaniu, że zwykle wpisuję części kodu w Google, aby uzyskać wynik, ale pozornie o tym zapomniałem, ale jak tylko zepsułem moje pytanie i przeanalizował go przed wysłaniem, szukałem go tylko '$ {0%}' i wylądowałem tutaj, jasno mi to wyjaśniłeś :) – SidOfc