10

我不敢相信我已经花了 1.5 个小时在这样微不足道的事情上。我正在编写一个非常简单的 shell 脚本,它 greps 文件,将输出存储在变量中,并将变量回显到 STDOUT。

我已经在命令行上使用正则表达式检查了 grep 命令,它工作正常。但是由于某种原因, grep 命令在 shell 脚本中不起作用。

这是我写的shell脚本:

#!/bin/bash

tt=grep 'test' $1
echo $tt

我使用以下命令运行它./myScript.sh testingFile:它只是打印一个空行。

  • 我已经使用了 chmod 并使脚本可执行。
  • 我检查了 PATH 变量是否包含/bin在其中。
  • 验证echo $SHELL/bin/bash
  • 在绝望中,我尝试了以下所有组合:
    • tt=grep 'test' "$1"
    • echo ${tt}
    • 根本不使用命令行参数,而是硬编码文件名tt=grep 'test' testingFile
  • 我发现了这一点:grep 在 bash 脚本中失败,但在命令行上工作,甚至用于dos2unix删除任何可能的回车符。
  • 此外,当我尝试使用任何 grep 选项时,例如:tt=grep -oE 'test' testingFile,我收到一条错误消息:./out.sh: line 3: -oE: command not found
  • 这太疯狂了。
4

1 回答 1

16

您需要使用命令替换:

#!/usr/bin/env bash

test=$(grep 'foo' "$1")
echo "$test"

命令替换允许命令的输出替换命令本身。当像这样包含命令时会发生命令替换:

$(command)

或者像这样使用反引号:

`command`

Bash 通过执行 COMMAND 并将命令替换替换为命令的标准输出来执行扩展,并删除任何尾随的换行符。嵌入的换行符不会被删除,但它们可能会在分词过程中被删除。

$()版本通常是首选,因为它允许嵌套:

$(command $(command))

有关更多信息,请阅读 中的command substitution部分man bash

于 2013-10-18T10:31:32.130 回答