У меня раздражающая проблема, я хочу, чтобы скрипт искал в make-файле (используя 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'
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
Из командной строки (это работает):
$ grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile
5:cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.
Из сценария (это НЕ работает, и я не могу понять, как заставить его работать): [ 119]
$ ./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
Когда «grep» работает из скрипта, я хотел использовать, может быть, «wc» или подобное, чтобы обнаружить наличие строки, а затем сделать что-то, основываясь на этом ...
Я просто не могу заставить его работать, пробовал много комбинаций «» и т. Д. - надеюсь, вы понимаете, чего я пытаюсь достичь, пожалуйста, помогите с идеями / предложениями, спасибо!
Чтобы присвоить значения переменным, вам нужно var=value
, а не var = value
. Пробелы в этом контексте значительны, и поэтому вы получаете ошибку command not found
из этой строки:
foundNumLines = $(grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile)
Это не переменное присваивание, это три команды: foundNumLines
, =
, и $(grep ... )
. Вам нужно:
foundNumLines=$(grep -in 'cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.' someMakefile)
Я знаю, что вы сказали, что это был make-файл, но я должен отметить, что конструкция $()
также имеет значение в оболочке. $(foo)
запустит команду foo
и вернет свой вывод. Поэтому эта строка:
cp $(OBJ_DIR)/$(EXE_FILE) ../bin/.
Сначала попытается выполнить $OBJ_DIR
и $EXE_FILE
как команды и вставить их выходные данные вместо переменных. Поскольку OBJ_DIR
, вероятно, не будет командой, это означает, что вы будете выполнять
cp / ../bin/.
Или, если EXE_FILE
находится в вашем пути и является исполняемым: кстати, там нет необходимости в .
, ../bin/
совпадает с ../bin/.
).
Я подумал, что упомяну это, так как у вас есть bash shebang в верхней части вашего примера make-файла, поэтому я предполагаю, что вы выполняете его как скрипт оболочки.