Fish Shell中的字符串操作

13
我希望编写一个Fish Shell脚本来自动将JAVA_HOME初始化为当前配置的java-alternative。
在Bash中,它看起来像这样(很抱歉有些丑陋的双重dirname)。
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

我放弃了字符串操作,转而使用set --export JAVA_HOME(update-alternatives --query javac | grep Value: | sed -e "s/Value: //" | sed 's,/[^/]+/$,,' | sed 's,/[^/]+/$,,')。 - lrkwz
4个回答

26

现在,fish shell 已经有一个内置的 string 命令来进行字符串操作。此功能于版本 2.3.0 中添加 (2016 年 5 月)。

例如,在这种情况下,我们可以使用 string replace 命令来删除 Value: 子字符串:

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

还有很多事情 string 可以做。根据string 命令文档:


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...]

哇,太棒了!如果我想在列表变量中使用类似于 string split " " "This is my teststring" 的结果,我该怎么做? - rassoh
1
例如:set mylist (string split " " "这是我的测试字符串") - @rassoh - mattbh
谢谢,非常好用!当然,为了将其变成列表,我必须执行 set -l mylist (...) - rassoh
@rassoh - -l 标志改变变量的作用域而不是其类型。请参阅 set 命令 - mattbh

3

Bash:

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 "${string}" : '.*\(regexp\).*'
$ set a /path/to/some/folder/file.extension

该命令:

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

提取文件的基本名称而不包括扩展名。
请参阅man expr

0
鱼壳(Fish shell):
~> 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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接