删除zsh / bash中的尾随字符串

时间:2017-11-12 11:24:43

标签: string bash shell zsh

我不熟悉shell中的编码,最近切换到zsh(不确定bashzsh之间是否存在语法差异)我正在尝试编写一个打印出包装版本的功能&在我的机器上工具。以下是我到目前为止foo --version的输出已注释掉的内容。

get_versions() {
  local brew_version=$(brew --version 2>/dev/null)
  # Homebrew 1.3.6
  # Homebrew/homebrew-core (git revision 8b18; last commit 2017-11-10)
  local create_react_app_version=$(create-react-app --version 2>/dev/null) # 1.4.3
  local elixir_version=$(elixir --version 2>/dev/null)
  # Erlang/OTP 20 [erts-9.1.3] [source] [64-bit] [smp:8:8] [ds:8:8:10] [async-threads:10] [hipe] [kernel-poll:false] [dtrace]
  #
  # Elixir 1.5.2
  local git_version=$(git --version 2>/dev/null) # git version 2.15.0
  local go_version=$(go version 2>/dev/null) # go version go1.9.2 darwin/amd64
  local hugo_version=$(hugo version 2>/dev/null) # Hugo Static Site Generator v0.30.2 darwin/amd64 BuildDate: 2017-11-10T10:06:36-06:00
  local mongo_version=$(mongo --version 2>/dev/null)
  # MongoDB shell version v3.4.10
  # git version: 078f28920cb24de0dd479b5ea6c66c644f6326e9
  # OpenSSL version: OpenSSL 1.0.2m  2 Nov 2017
  # allocator: system
  # modules: none
  # build environment:
  #     distarch: x86_64
  #     target_arch: x86_64
  local node_version=$(node --version 2>/dev/null) # v9.1.0
  local now_version=$(now --version 2>/dev/null) # 8.4.0
  local npm_version=$(npm --version 2>/dev/null) # 5.5.1
  local nvm_version=$(nvm --version 2>/dev/null) # 0.33.6
  local psql_version=$(psql --version 2>/dev/null) # psql (PostgreSQL) 10.1
  local yarn_version=$(yarn --version 2>/dev/null) # 1.3.2
  local zsh_version=$(zsh --version 2>/dev/null) # zsh 5.4.2 (x86_64-apple-darwin17.0.0)

  # echo "brew:----------------- ${brew_version:9}"
  echo "create-react-app:----- ${create_react_app_version}"
  echo "elixir:--------------- ${elixir_version:130}"
  echo "git:------------------ ${git_version:12}"
  # echo "go:------------------- ${go_version:13}"
  # echo "hugo:----------------- ${hugo_version:28}"
  # echo "mongo:---------------- ${mongo_version:23}"
  echo "node:----------------- ${node_version:1}"
  echo "now:------------------ ${now_version}"
  echo "npm:------------------ ${npm_version}"
  echo "nvm:------------------ ${nvm_version}"
  echo "psql:----------------- ${psql_version:18}"
  echo "yarn:----------------- ${yarn_version}"
  # echo "zsh:------------------ ${zsh_version:4}"
}

我的问题是关于如何处理输出中我不想要的尾随字符串。我发现使用带有整数的:就像来自JavaScript的substring(),从而产生从字符串的指定索引开始的结果。

例如mongo在输出中非常详细。目前调用mongo_version:23会让我看到版本号,但我仍然在我的自定义输出中留下了许多我不想要的字符串。

附加图像显示当具有尾随字符串的变量时当前输出的内容。

expected output

unwanted output

2 个答案:

答案 0 :(得分:2)

如果您可以使用${var:offset}语法,则可以使用${var:offset:length}语法,例如

echo ${mongo_version:23:6}

应该打印

3.4.10

答案 1 :(得分:0)

要处理来自mongo的多行输出,您可以利用builtin read

  

读取一行并使用$ IFS中的字符作为分隔符将其分成字段,除非如下所述。第一个字段分配给第一个名称,第二个字段分配给第二个名称,等等,剩余字段分配给姓氏。如果省略name,那么REPLY用于标量并回复数组。

function show_mongo_version() {
  read -r
  print "mongo version: $REPLY"
}

由于我们只想按原样存储行,因此当read没有给出任何参数时,此代码利用REPLY将行读取存储到单个标量read的行为名。此外,虽然对您的示例并非严格必要,但代码进一步减少了zsh对使用-r(原始)读取的数据执行的潜在后处理。

用以下方法测试:

show_mongo_version <<-'EOF'
MongoDB shell version v3.4.10
git version: 078f28920cb24de0dd479b5ea6c66c644f6326e9
OpenSSL version: OpenSSL 1.0.2m  2 Nov 2017
allocator: system
modules: none
build environment:
    distarch: x86_64
    target_arch: x86_64
EOF

得到:

mongo version: MongoDB shell version v3.4.10

或者,如果您只想要实际的版本字符串,利用通常的拆分空白行为,并将该行存储在一个数组中,然后选择您想要的位:

function show_mongo_array() {
  read -rA
  print "mongo version: $reply[4]"
}

得到:

mongo version: v3.4.10