bash shell脚本,在makefile中搜索复杂行(shell参数扩展问题)

Oka*_*key 3 command-line bash scripts

我有一个烦人的问题,我想要一个脚本来搜索生成文件(使用 grep)以查找特定烦人的行。最好具体说明这个问题:

someMakefile(最小的 Makefile):

#!/usr/bin/env bash
echo bla bla
OBJ_DIR='something'
EXE_FILE='my_exe'
cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.
echo 'doing something else now'
Run Code Online (Sandbox Code Playgroud)

testScript.sh(测试是否存在困难线):

cat testScript.sh

#!/usr/bin/env bash
set -x
foundNumLines = $(grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile)
echo "foundNumLines = $foundNumLines"
set +x
Run Code Online (Sandbox Code Playgroud)

从命令行(这确实有效):

$ grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile
5:cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.
Run Code Online (Sandbox Code Playgroud)

从脚本(这不起作用,我无法弄清楚如何使其工作):

$ ./testScript.sh 
++ grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile
+ foundNumLines = 5:cp '$(OBJ_DIR)/$(EXE_FILE)' ../bin/.
./testScript.sh: line 4: foundNumLines: command not found
+ echo 'foundNumLines = '
foundNumLines = 
+ set +x
Run Code Online (Sandbox Code Playgroud)

当“grep”从脚本中工作时,我想使用“wc”或类似的东西来检测该行的存在,然后基于此做一些事情......

我只是无法让它工作,尝试了许多“'”\'等组合 - 我希望你明白,我想要实现的目标,请帮助提供想法/建议,谢谢!

ter*_*don 5

要将值分配给变量,您需要var=value而不是var = value. 在这种情况下,空格很重要,这就是您command not found从这一行收到错误的原因:

foundNumLines = $(grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile)
Run Code Online (Sandbox Code Playgroud)

这不是一个变量赋值,这是三个命令:foundNumLines=,和$(grep ... )。你需要的是:

foundNumLines=$(grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile)
Run Code Online (Sandbox Code Playgroud)

我知道你说它是一个 makefile,但我应该指出这个$()构造在 shell 中也有意义。$(foo)将运行命令 foo并返回其输出。因此,这一行:

cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.
Run Code Online (Sandbox Code Playgroud)

将首先尝试执行$OBJ_DIR$EXE_FILE作为命令并将其输出插入变量的位置。由于OBJ_DIR可能不是命令,这意味着您将执行

cp / ../bin/.
Run Code Online (Sandbox Code Playgroud)

或者,如果EXE_FILE在您的路径和可执行文件中:

cp /$outputOfExec_File ../bin/.
Run Code Online (Sandbox Code Playgroud)

(顺便说一句,那里没有必要.../bin/与 相同../bin/.)。

我想我会提到这一点,因为您的 makefile 示例顶部有一个 bash shebang,所以我假设您将它作为 shell 脚本执行。