我想检查(仅)第一行中没有#!/usr/bin/env python
的python文件。所以,我写了一个执行以下操作的bash脚本:
#!/bin/bash
#list all of python files
for file in `find . -name "*.py"`
do
if [ `head -1 $file` != "#!/usr/bin/env python"] then;
echo "no match in file $file"
else then;
echo "match!"
fi
done
但是,出于某种原因,我无法正确地发现if
声明!我已经看了很多问题,但我找不到一个简洁地描述这个问题的问题。以下是错误消息:
./run_test.sh: line 9: syntax error near unexpected token `else'
./run_test.sh: line 9: ` else then;'
我哪里出错了?谢谢。
答案 0 :(得分:2)
您可以执行类似
的操作find . -type f -name '*.py' -exec \
awk 'NR==1 && /#!\/usr\/bin\/env python/ \
{ print "Match in file " FILENAME; exit } \
{ print "No match in file " FILENAME; exit }' \
{} \;
如果要循环播放,don't use a for loop
#!/bin/bash
find . -type f -name '*.py' -print0 | while IFS= read -r -d $'\0' file; do
if [[ $(head -n1 "$file") == "#!/usr/bin/env python" ]]; then
echo "Match in file [$file]"
else
echo "No match in file [$file]"
fi
done
答案 1 :(得分:1)
需要注意的事项:
您在else之后添加了一个额外的然后。
#!/bin/bash
#list all of python files
for file in `find . -name "*.py"`
do
if [ `head -1 $file` != "#!/usr/bin/env python" ];
then
echo "no match in file $file"
else
echo "match!"
fi
done
答案 2 :(得分:-1)
你有机会使用-exec
选项吗?我发现它更容易。
find . -name "*.py" -exec head -1 {} | grep -H '#!/usr/bin/env python' \;
您可以使用grep
选项控制输出。
感谢@chepner - 为了避免过早吞下管道:
-exec sh -c "head -1 {} | grep -H '#!/usr/bin/env python'" \;