2011-01-29 14 views
5

Chciałbym napisać skrypt powłoki rybnej, aby automatycznie zainicjować JAVA_HOME na aktualnie skonfigurowaną wersję java-alternative.Obsługa ciągów w powłoce rybnej

W bash będzie to wyglądać tak (przepraszam za brzydkie podwójnym dirname)

j=`update-alternatives --query javac | grep Value:` 
JAVA_HOME=`dirname ${j#Value:}` 
JAVA_HOME=`dirname $JAVA_HOME` 
export JAVA_HOME 

co z rybami?

set j (update-alternatives --query javac | grep Value:) 
set JAVA_HOME (dirname ${j#Value:}) <-- this won't work!! 
set JAVA_HOME (dirname $JAVA_HOME) 
set --export JAVA_HOME 
+0

zrezygnowałem ciąg manipulacji na rzecz zestawu --export JAVA_HOME (update-alternatives --query javac | grep Wartość: | sed -e "s/Wartość: //" | sed „s ,/* [^ /] \ +/* $ ,, 'sed' s,/* [^ /] \ +/* $ ,, ') – lrkwz

Odpowiedz

2

Bash:

j=$(update-alternatives --query javac | sed -n '/Value: /s///p') 
export JAVA_HOME=${j%/*/*} 

Ryby:

set j (update-alternatives --query javac | sed -n '/Value: /s///p') 
set --export JAVA_HOME (dirname (dirname $j)) 

lub

set --export JAVA_HOME (dirname (dirname (update-alternatives --query javac | sed -n '/Value: /s///p'))) 
2

Zamiast sed, może u wykorzystanie expr z regexp, na przykład:

$ set a /path/to/some/folder/file.extension 

polecenie:

$ expr "//$a" : '.*/\([^.]*\)\..*$' 
file 

wyodrębnić miejscami nazwę pliku bez rozszerzenia.

Zobacz man expr

0

Fish shell:

~> set JAVA_HOME (readlink -f /usr/bin/javac | sed "s:/bin/javac::") 
~> echo $JAVA_HOME 

wyjściowa (przykład):

/usr/lib/jvm/java-8-openjdk-amd64 

także u można dodać do ~/.config/fish/config.fish tej linii:

set JAVA_HOME (readlink -f /usr/bin/javac | sed "s:/bin/javac::") 

WBR

11

Powłoka z rybą ma teraz wbudowane polecenie string do manipulowania ciągami. Zostało to dodane w wersji 2.3.0 (maj 2016).

E.g. w tym przypadku, możemy użyć string replace usunąć Value: podciąg:

set j (update-alternatives --query javac | grep Value: | string replace 'Value: ' '') 
set --export JAVA_HOME (dirname (dirname $j)) 

Jest dużo bardziej, że string może zrobić. Z string command documentation:

Synopsis 

string length [(-q | --quiet)] [STRING...] 
string sub [(-s | --start) START] [(-l | --length) LENGTH] [(-q | --quiet)] 
      [STRING...] 
string split [(-m | --max) MAX] [(-r | --right)] [(-q | --quiet)] SEP 
      [STRING...] 
string join [(-q | --quiet)] SEP [STRING...] 
string trim [(-l | --left)] [(-r | --right)] [(-c | --chars CHARS)] 
      [(-q | --quiet)] [STRING...] 
string escape [(-n | --no-quoted)] [STRING...] 
string match [(-a | --all)] [(-i | --ignore-case)] [(-r | --regex)] 
      [(-n | --index)] [(-q | --quiet)] [(-v | --invert)] PATTERN [STRING...] 
string replace [(-a | --all)] [(-i | --ignore-case)] [(-r | --regex)] 
       [(-q | --quiet)] PATTERN REPLACEMENT [STRING...] 
+0

Wow, świetnie! Jeśli chcę użyć wyników takich jak 'string split" "" To jest mój teststring "' w zmiennej listy, w jaki sposób mam to zrobić? – rassoh

+1

@rassoh - Dla przykładu: 'set mylist (string split" "" To jest mój teststring ")' – mattbh

+0

dzięki, działa świetnie! Oczywiście, aby zrobić listę, musiałem to zrobić 'set -l mylist (...)' – rassoh

Powiązane problemy