【问题标题】:How to parse multiple line output as separate variables如何将多行输出解析为单独的变量
【发布时间】:2021-04-05 00:02:41
【问题描述】:

我对 bash 脚本比较陌生,希望有人能正确解释这一点,谢谢。这是我的代码:

#! /bin/bash

echo "first arg: $1"
echo "first arg: $2"
var="$( grep -rnw $1 -e $2 | cut -d ":" -f1 )"
var2=$( grep -rnw $1 -e $2 | cut -d ":" -f1 | awk '{print substr($0,length,1)}')

echo "$var"
echo "$var2"

我遇到的问题是输出,我正在尝试编写的脚本是一个 c++ 函数搜索器,因此在启动我的脚本时我有 2 个参数,一个用于目录,第二个作为函数名。这就是我的输出的样子:

first arg: Projekt
first arg: iseven
Projekt/AX/include/ax.h
Projekt/AX/src/ax.cpp
h
p

现在我的问题是:如何将逐行输出保存为变量,以便以后可以使用var 作为路径,或者使用var2 作为字符进行比较。我的计划是使用 IF() 语句来确定类型,想法:IF(last_char == p){echo:"something"}我尝试的是这个问题:Capturing multiple line output into a Bash variable,然后给它一个数组。所以我的代码看起来像:"${var[0]}"。请解释我以后如何使用我的行输出作为变量。

【问题讨论】:

  • stackoverflow.com/a/17602863/9072753echo "${var[0]}"。首先你必须var=($(....))。先在网上研究一下bash数组,有很多好的资源..
  • 对不起,但是,“${var[0]}”正是我写的,它不起作用,有没有办法让每个输出行作为一个单独的字符串?
  • 在你的问题中你说echo "$var[0]"是你写的。这与echo "${var[0]}" 不同。如果您以何种方式告诉我们“它不起作用”,那么我们可能会帮助您调试问题。
  • 我现在已经编辑了问题,对不起,这是我的错,因为我不经常使用 bash,我只是不假思索地使用了“c++ 语法”

标签: bash shell awk grep


【解决方案1】:

我会使用readarray 来填充数组变量,以防万一您的命令输出中存在不应用作字段分隔符的空格,而这最终会弄乱foo=( ... )。并且可以使用 shell 参数扩展子字符串语法来获取变量的最后一个字符;你的var2 中不需要那个awk 位:

#!/usr/bin/env bash

readarray -t lines < <(printf "%s\n" "Projekt/AX/include/ax.h" "Projekt/AX/src/ax.cpp")

for line in "${lines[@]}"; do
    printf "%s\n%s\n" "$line" "${line: -1}" # Note the space before the -1
done

会显示

Projekt/AX/include/ax.h
h
Projekt/AX/src/ax.cpp
p

【讨论】:

  • my_array=() while IFS= read -r line; do my_array+=( "$line" ) done &lt; &lt;( grep -rnw $1 -e $2 | cut -d ":" -f1)
  • 我所做的是使用这个命令,因为我以后需要对这些变量进行优化,如果我错了,请纠正我,但我认为我不能用你的解决方案做到这一点,因为稍后我将在脚本中对此进行比较
  • @ekaeo Er... 使用readarray,而不是循环。更高效、更简单、更清晰、更不容易出错。这就是为什么我首先建议它。然后使用数组及其元素。
  • 我已经试过了,稍微改了一下,但是,谢谢,尽管它确实说 readarray 不像你说的那样容易出错。与我所做的相比,我猜错误更少
猜你喜欢
  • 2015-05-14
  • 1970-01-01
  • 1970-01-01
  • 2012-03-07
  • 1970-01-01
  • 2020-03-15
  • 1970-01-01
  • 2013-11-25
  • 1970-01-01
相关资源
最近更新 更多