实现一个Linux脚本,该脚本使用 for 循环遍历当前目录下的所有 .c 文件。
对于每个 .c 文件,使用 grep 命令来查找是否包含字符串 “main”。
如果该 .c 文件包含 “main”,则输出到/home/majn/llvm_project/extract_main目录下。
#!/bin/bash
# 目标目录
TARGET_DIR="/home/majn/llvm_project/extract_main"
# 创建目标目录,如果不存在的话
mkdir -p "$TARGET_DIR"
# 遍历当前目录下的所有 .c 文件
for file in *.c; do
# 使用 grep 命令查找是否包含字符串 "main"
if grep -q "main" "$file"; then
# 如果找到,将该 .c 文件复制到目标目录下
cp "$file" "$TARGET_DIR/"
echo "Copied $file to $TARGET_DIR"
else
echo "$file does not contain 'main'"
fi
done
这里做了以下几件事:
- 使用
mkdir -p
创建目标目录(如果不存在)。 - 使用
for
循环遍历当前目录下的所有.c
文件。 - 使用
grep -q
查找每个文件中是否包含字符串"main"
。 - 如果包含,使用
cp
命令将文件复制到目标目录。
注1:在shell脚本中,
if
语句的条件测试基于命令的退出状态(exit status)。在Unix和Linux中,退出状态0
通常表示“成功”,而非0
的退出状态通常表示“失败”。
当grep -q
在file.txt
中找到匹配项时,它将返回0
,这在if
语句中被解释为“真”或“成功”。因此,控制流将进入then
分支,并执行echo "Pattern found!"
。反之,如果grep -q
没有在file.txt
中找到匹配项,它将返回一个非0
的退出状态,这在if
语句中被解释为“假”或“失败”。因此,控制流将进入else
分支,并执行echo "Pattern not found!"
。
总结一下:在这个if
语句中,如果grep -q
找到匹配项(即成功),then
分支将被执行;如果没有找到匹配项(即失败),else
分支将被执行。这与grep -q
命令返回的退出状态是一致的。
保存这个脚本,给它可执行权限,然后运行它:
chmod +x your_script.sh
./your_script.sh
注意:请确保你有写入 /home/majn/llvm_project/extract_main
目录的权限,并且在运行脚本之前要小心,以确保不会覆盖重要文件。如果需要,先在一个测试目录中运行这个脚本。
上述脚本执行报错!!!
./main.sh
-bash: ./main.sh: /bin/bash^M: bad interpreter: No such file or directory
这个错误通常是因为脚本文件中含有 Windows 风格的换行符(\r\n
),而 Linux 期望的是 UNIX 风格的换行符(\n
)。当你在 Windows 系统中创建或编辑文本文件并将其转移到 Linux 系统时,这种情况可能会发生。
你可以使用 dos2unix
工具来转换文件的换行符。首先,你需要安装 dos2unix
:
sudo apt update
sudo apt install dos2unix # 在基于 Debian 的系统中
或者
yum install dos2unix # 在基于 RedHat 的系统中
然后,你可以运行下面的命令来转换脚本文件:
dos2unix main.sh
这会把 main.sh
中的所有 Windows 风格的换行符转换为 UNIX 风格的换行符。
然后,你应该能够正常运行脚本:
chmod +x main.sh
./main.sh
如果你没有 dos2unix
工具,也可以使用 sed
来进行转换:
sed -i 's/\r$//' main.sh
这行 sed
命令会查找并移除文件中所有行尾的 \r
字符。之后,你应该能够正常执行该脚本。
注2:grep
是一个常用的文本搜索工具,它可以搜索符合特定模式的行。-q
是grep
的一个选项,全称为--quiet
或--silent
,用于使grep
运行时不输出任何内容。换句话说,使用-q
选项时,grep
不会打印匹配的行。
尽管-q
阻止了输出,但grep
的退出状态仍然是基于搜索结果的。如果找到匹配项,grep
将返回0
(表示成功),如果没有找到匹配项,则返回非0
值(表示失败)。
grep -q
经常与shell脚本中的条件测试结合使用,因为通常在脚本中你可能只关心是否存在匹配项,而不关心具体的匹配内容。例如:
if grep -q "pattern" file.txt; then
echo "Pattern found!"
else
echo "Pattern not found!"
fi
在上面的示例中,脚本只检查file.txt
中是否有匹配"pattern"的内容,而不显示实际的匹配行。如果找到匹配项,它会输出"Pattern found!“,否则输出"Pattern not found!”。