bash - 在 shell 脚本中使用 grep 会出现找不到文件的错误

标签 bash shell ubuntu grep

我不敢相信我已经花了 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:第 3 行:-oE:找不到命令
  • 这太疯狂了。

最佳答案

您需要使用命令替换:

#!/usr/bin/env bash

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

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

$(command)

或者像这样使用反引号:

`command`

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

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

$(command $(command))

有关详细信息,请阅读 man bash 中的命令替换部分。

关于bash - 在 shell 脚本中使用 grep 会出现找不到文件的错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19447352/

相关文章:

bash - 在命令 bash 终端中使用 R

linux - 使用任务集在 Linux 上的处理器关联

在 Ubuntu 16.10 上使用 "Error: No available targets are compatible with this triple"将 C 程序编译为 WebAssembly 程序

bash - 为什么 PS1 的函数调用需要转义?

bash - 如何通过 Cron 运行 bash 脚本

linux - 如何在Linux中找到哪个进程正在生成另一个进程?

shell - Jenkins:如何在 Windows 从站中执行 shell 脚本

regex - 复制与范围内的数字模式匹配的文件

linux - 如何在 ssh 中显示换行符

java - 如何在 Java 中以 sudo 权限执行 bash 命令?