2013-10-18 41 views
8

我不敢相信我已经花了1.5个小时处理这些微不足道的事情。我正在编写一个简单的shell脚本,用于读取文件,将输出存储在一个变量中,并将变量回显到STDOUT。在shell脚本中使用grep给出找不到文件的错误

我已经检查了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 fails inside bash script but works on command line,甚至用dos2unix删除任何可能的回车。
  • 此外,当我尝试使用任何grep选项时,如:tt=grep -oE 'test' testingFile,我收到错误消息:./out.sh: line 3: -oE: command not found
  • 这太疯狂了。
+0

你正在做的事是临时的(仅对于这个命令),将环境变量'tt'设置为字符串'grep',并运行'$ 1'内容的参数'test' ,第一个脚本参数)(和'tt'环境变量集合) –

回答

13

您需要使用命令替换:

#!/usr/bin/env bash 

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

命令替换允许一个命令的输出替换命令本身。当一个命令括这样发生命令替换:

$(command) 

或像这样使用反引号:

`command` 

击执行由执行指令,并使用该命令的标准输出替换命令替换膨胀,任何尾随的换行符被删除。嵌入换行符不会被删除,但可能会在分词过程中被删除。

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

$(command $(command)) 

有关详细信息读取command substitution部分中man bash

+0

哇。非常感谢。 只是好奇,这是不同的zsh? – Bonz0