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”或类似的东西来检测该行的存在,然后基于此做一些事情......
我只是无法让它工作,尝试了许多“'”\'等组合 - 我希望你明白,我想要实现的目标,请帮助提供想法/建议,谢谢!
要将值分配给变量,您需要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 脚本执行。