2011-01-29 96 views
5

我希望編寫一個魚殼腳本來自動將JAVA_HOME初始化爲當前配置的java-alternative。魚殼中的字符串操作

在bash它看起來像這樣(對不起,醜陋的雙目錄名)

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

什麼魚?

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

我辭職的字符串操作有利於一套--export JAVA_HOME(更新替代--query的javac | grep的價值:| sed的-e 「S /值://」 | SED的,/ * [^ /] \ +/* $ ,,'| sed's,/ * [^ /] \ +/* $ ,,'') – lrkwz 2011-01-29 19:37:13

回答

2

擊:

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

魚:

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

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

相反的SED,ü可以使用expr的用正則表達式,例如:

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

命令:

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

提取的文件名前綴沒有擴展。

參見man expr

0

魚殼:

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

輸出(例如):

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

此外ü可以添加到~/.config/fish/config.fish這一行:

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

WBR

11

魚殼現在有一個string內置命令用於字符串操作。這是在版本2.3.0(2016年5月)中添加的。

E.g.在這種情況下,我們可以使用string replace刪除Value:子:

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

還有很多更多的string可以做。從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

太棒了!如果我想在列表變量中使用「字符串分割」「」這是我的測試字符串「」的結果,我該怎麼做? – rassoh 2016-12-21 12:43:48