如何将命令结果设置为变量

时间:2016-07-11 12:39:39

标签: bash unix grep

我试图显示第一个'字符串'的行号。从长字符串变量中出现并将结果设置为其他变量。

显示第一个'字符串"我使用的出现:

grep -n -m 1 String Filename.csv |cut -f1 -d:

工作正常。但是我想得到' String'数组变量的值和Filename.csv切换到长字符串。例如:

string[0]='Column2'

Query="Select Column1,
              Column2,
              Column3
       From   dual"

现在:

Line_number=$(grep -n -m 1 ${string[0]} "$Query" |cut -f1 -d:)
echo $Line_number

结果应该是:2

不显示: grep:"选择Column1,                   列2,                   栏3            从双"没有相应的文件和目录 怎么了?

2 个答案:

答案 0 :(得分:0)

将脚本更改为:

string[0]='Column2'

Query="Select Column1,\n
              Column2,\n
              Column3\n
       From   dual"

Line_number=$(echo $Query | grep -n -m 1 ${string[0]} |cut -f1 -d:)
echo $Line_number

看看你会得到什么。

答案 1 :(得分:0)

对此的解决方案是:

arr=$(echo "${string[@]}")
line_number=$(awk -v var="$arr" '$0 ~ var{print NR;exit 0}' <<<"$Query")
echo "$line_number"

这里发生了什么?

  • 我们无法直接将bash数组传递给awk,因此我们echo对其进行了编辑并将其存储在arr中。
  • var="$arr"将shell变量存储到awk变量var
  • $0 ~ var{print NR;exit 0}检查(〜)模式,打印第一次出现的行号并退出脚本。
  • bash中的
  • <<<称为herestring,它可以帮助您将字符串传递给命令。
对此的解决方案是:

arr=$(echo "${string[@]}")
line_number=$(sed -n "/$arr/{=;q}" <<<"$Query")
echo "$line_number"

这里发生了什么?

  • 我们无法直接将bash数组传递给sed,因此我们echo对其进行了编辑并将其存储在arr中。
  • -n选项会抑制正常输出。
  • /$arr/{=;q}检查模式(/stuff/),打印行号(=)然后退出(q)sed。