【问题标题】:Using grep inside shell script gives file not found error在 shell 脚本中使用 grep 会导致找不到文件错误
【发布时间】:2013-10-27 03:51:43
【问题描述】:

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

【问题讨论】:

  • 您正在做的是暂时(仅针对此命令)将环境变量 tt 设置为字符串 grep 并运行命令 test 并使用从 @ 的内容中获取的参数987654336@(即第一个脚本参数)(并设置了tt环境变量)

标签: bash shell ubuntu grep


【解决方案1】:

您需要使用命令替换:

#!/usr/bin/env bash

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

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

$(command)

或者像这样使用反引号:

`command`

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

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

$(command $(command))

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

【讨论】:

  • 哇。太感谢了。只是好奇,这对 zsh 有什么不同吗?
猜你喜欢
  • 1970-01-01
  • 2014-10-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-01
  • 2015-01-18
  • 1970-01-01
相关资源
最近更新 更多