【问题标题】:Shellscript: return multiple values for cut function [duplicate]Shellscript:为剪切函数返回多个值[重复]
【发布时间】:2017-02-28 12:57:59
【问题描述】:

我正在使用 cut 函数来获取所有子字符串。例如:我有一个名为“v1.2.3”的字符串。我想将 1 分配给专业。 2 到次要和 3 到错误(删除第一个字符始终是 v)

例如:

  major=$(echo $tag | cut -d'.' -f1)
  minor=$(echo $tag | cut -d'.' -f2)
  bug=$(echo $tag | cut -d'.' -f3)
  echo "$major $minor $bug"

此脚本扩展为 3 行。我的问题是:如何在一次调用中返回所有f1 f2f3 并同时分配回major minorbug

我也尝试使用正则表达式。例如:v1.2.3 将分别拆分为 1,2 和 3,但似乎不起作用。

  re="^v(.*).(.*).(.*)$"
  [[ $tag =~ $re ]] && major="${BASH_REMATCH[1]}" && minor="${BASH_REMATCH[2]}" && patch="${BASH_REMATCH[3]}"
  echo $major
  echo $minor
  echo $patch

谢谢。

【问题讨论】:

  • @tripleee 谢谢。我已经更新了使用正则表达式的问题。请看一看。
  • 您的正则表达式是不确定的。如果你想在文字点上分割,IFS='.' 如建议的副本中所建议的那样。 (FWIW 匹配文字点的正则表达式是 \. 或等效的 [.]。)要修剪前导前缀,${tag#v} 会生成 tag 的值,并删除任何前导 v
  • @tripleee 谢谢。但使用这种方法。我会丢失一些我在其他地方需要的关于 $2 $3 的信息。我该如何解决这个问题
  • @TrầnKimDự:在下面查看我的答案。
  • 如果您想提出的方法尚未在此处记录,请标记为重复并将您的答案发布到指定的重复项。

标签: shell sh


【解决方案1】:

这可以在纯bash string-manipulation 中完成,请参阅shell-parameter-expansion 了解各种技术。

$ IFS="." read -r major minor bug <<< "v1.2.3" # read the strings to variables
$ major="${major/v/}"                          # removing the character 'v' from major
$ printf "%s %s %s\n" "$major" "$minor" "$bug" # printing the individual variables
1 2 3

【讨论】:

    【解决方案2】:

    我最近了解了“阅读”。有点像这样:

    #set field separator to match your delimiter
    ifsOld=$IFS
    IFS='.'
    
    read major minor bug <<<$(echo $tag | cut -d'.' -f 1,2,3)
    
    IFS=$ifsOld
    

    例如:

    $ IFS='.'
    $ read major minor bug <<<$(echo 127.1.2.123 | cut -d'.' -f 1,2,3)
    $ echo $major $minor $bug
    127 1 2
    $
    

    【讨论】:

    • 您的代码提供给我。 major 将为“127 1 2”,但 minor 和 bug 都将为空
    • 我已经更新了我的问题。在排序中,我想将 1/2/3 分解为每个变量。
    • 我没听懂。例如,如果我改用 echo $bug $minor $major 它将返回 2 1 127 编辑:但在 2 种不同的 linux 风格上,它只适用于其中一种 :(
    猜你喜欢
    • 2011-04-19
    • 1970-01-01
    • 2015-07-07
    • 2014-09-12
    • 2020-03-20
    • 1970-01-01
    • 2011-04-18
    相关资源
    最近更新 更多