我不熟悉shell中的编码,最近切换到zsh
(不确定bash
和zsh
之间是否存在语法差异)我正在尝试编写一个打印出包装版本的功能&在我的机器上工具。以下是我到目前为止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
会让我看到版本号,但我仍然在我的自定义输出中留下了许多我不想要的字符串。
附加图像显示当具有尾随字符串的变量时当前输出的内容。
答案 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