2011-06-18 18 views
40

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

Odpowiedz

60

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 
+2

tak, to AA 'dirname ($ 0)' – jm666

+5

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

+0

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