2011-01-29 75 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