如果我执行下面名为 的 bash 脚本test.sh
,我会收到此错误:
./test.sh: line 8: grep -irl -e"1234567891" ./save: No such file or directory
如果我从 CLI“手动”执行从错误中获取的上面的行,它会按预期工作并找到包含所请求模式的单个文件。
#!/bin/bash
list="text_list.txt"
ddt_folder1="Save/"
while IFS= read -r line
do
test=$("grep -irl -e\"$line\" ./save")
echo "$test"
done < "$list"
到目前为止测试过:
在循环之前在顶部回显“pwd”,并且路径是保存文件夹所在的正确路径
echo $("pwd")
我还使用目标目录的完整路径进行了测试:
test=$("grep -irl -e\"$line\" ./full/path/save")
还使用完整的 grep 路径进行了测试:
test=$("/usr/bin/grep -irl -e\"$line\" ./full/path/save")
测试 grep 类型的完整路径:
type /usr/bin/grep
/usr/bin/grep is /usr/bin/grep
无论如何,在所有测试中,如果我从 cli“手动”使用错误消息中显示的命令,它就可以工作。
我缺少什么!?
非常感谢
答案1
错误就在这里
test=$("grep -irl -e\"$line\" ./save")
您已经引用了求值括号内的文本$( ... )
,因此 shell 无法将其拆分为单词。结果是它尝试执行在的值所在的save
目录中调用的命令。 (是的,这可以是真实的文件/目录名称;尝试然后)显然,无论插入到字符串中的 值如何,它都不会存在。grep -irl -e"1234567891" .
1234567891
$line
touch 'grep -irl -e"1234567891" .'
ls
$line
用这个代替
test=$(grep -irl -e "$line" ./save)
顺便说一句,echo $("pwd")
同样不正确,应该是echo "$(pwd)"
。但是,如果您所在的目录名称以破折号(例如-work
)开头,则这可能会失败,因此可以更轻松、更正确地将其简单地写为pwd
。
grep
最后,要删除您之前使用 创建的文件名开头的文件touch
,请使用rm -i ./grep*
并输入y
以确认删除。