2011-01-29 7 views
5

Je souhaite écrire un script shell de poisson pour initialiser automatiquement JAVA_HOME java-alternatif configuré en cours.manipulation de cordes dans la coquille de poisson

En bash, il ressemblerait à ceci (désolé pour le double dirname laid)

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

ce que sur les poissons?

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

Je résigne la manipulation de chaînes en faveur du jeu --export JAVA_HOME (update-alternatives --query javac | grep Valeur: | sed -e "s/Valeur: //" | sed « s ,/* [^ /] \ +/* $ ,, » | sed 's,/* [^]/\ +/* $ ,,') – lrkwz

Répondre

2

Bash:

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

Poisson:

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

ou

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

lieu de sed, u pourrait utiliser expr avec une expression rationnelle, par exemple:

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

la commande:

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

extrait le fichier basename sans extension.

Voir man expr

0

coquille de poisson:

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

sortie (exemple):

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

u peut également ajouter à cette ligne ~/.config/fish/config.fish:

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

WBR

11

La coquille de poisson a maintenant une string commande pour la manipulation de builtin chaîne. Cela a été ajouté dans la version 2.3.0 (mai 2016).

E.g. dans ce cas, nous pourrions utiliser string replace pour enlever la sous-chaîne Value::

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

Il y a beaucoup plus que string peut faire. De l'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, super! Si je veux utiliser les résultats de quelque chose comme 'split de chaîne '" "Ceci est ma chaîne de tests" 'dans une variable de liste, comment ferais-je cela? – rassoh

+1

@rassoh - A titre d'exemple: 'set maliste (string split "" "Ceci est mon TestString")' – mattbh

+0

grâce, fonctionne très bien! Bien sûr, pour en faire une liste que je devais faire 'set -l mylist (...)' – rassoh

Questions connexes