【问题标题】:String manipulation in fish shell鱼壳中的字符串操作
【发布时间】:2011-01-29 19:15:53
【问题描述】:

我想写一个fish shell脚本来自动将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

【问题讨论】:

  • 我放弃了字符串操作以支持 set --export JAVA_HOME (update-alternatives --query javac | grep Value: | sed -e "s/Value: //" | sed 's,/ *[^/]\+/*$,,' | sed 's,/*[^/]\+/*$,,')

标签: fish


【解决方案1】:

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

【讨论】:

  • 哇,太好了!如果我想在列表变量中使用 string split " " "This is my teststring" 之类的结果,我该怎么做?
  • @rassoh - 例如:set mylist (string split " " "This is my teststring")
  • 谢谢,效果很好!当然,要让它成为一个列表,我必须这样做set -l mylist (...)
  • @rassoh - -l 标志更改变量的范围而不是其类型。请参阅set command。
【解决方案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')))

【讨论】:

    【解决方案3】:

    你可以使用带有正则表达式的 expr 来代替 sed,例如:

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

    命令:

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

    提取没有扩展名的文件基名。

    见man expr

    【讨论】:

      【解决方案4】:

      鱼壳:

      ~> 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-03-16
        • 1970-01-01
        • 2020-05-10
        • 1970-01-01
        • 2014-02-24
        • 2016-11-23
        • 1970-01-01
        • 2014-04-24
        相关资源
        最近更新 更多