这是我的问题陈述。
编写一个以文件夹名称作为命令行参数的shell脚本,并生成一个文件,其中包含大小为0的所有子文件夹(即空子文件夹)的名称
这是我的shell脚本。
ls $1
while read folder
do
files = 'ls $folder | wc -l'
if[$files -eq 0];
then
echo "$folder">>output.txt
echo "File deleted"
else
echo "File is not empty"
fi
done
当我执行命令(使用“ sh文件名”)时,它显示语法错误!
Syntax error: "then" unexpected (expecting "done")
我的脚本有问题吗?
答案 0 :(得分:1)
别忘了,shell [
中的二进制文件带有参数并返回true或false(0或1)。
if
是一个关键字,用于验证返回的下一个二进制数是否为true(0)。
所以,当你这样做
if[$files -eq 0]
您的外壳一无所知,因为它尝试启动if[2
程序,而他在未检测到then
之后找到了if
。
为了解决您的问题,您必须在if
之后和[
之后放置一个空格,因为二进制文件的名称和参数之间必须有一个空格。
ls $1
while read folder
do
files = `ls $folder | wc -l`
if [ $files -eq 0 ]
then
echo "$folder">>output.txt
echo "File deleted"
else
echo "File is not empty"
fi
done
答案 1 :(得分:0)
尝试这样的事情
ls $1
while read folder
do
files=`ls $folder | wc -l`
if [ $files -eq 0 ]; then
echo "$folder">>output.txt
echo "File deleted"
else
echo "File is not empty"
fi
done
请注意,没有空格文件= ..,并且有((反引号)不是'(单引号)
注意'if'和'['...之间的空格...
答案 2 :(得分:0)
可能存在间距错误:
只需执行2个步骤:
app.add_api
hexdump -C yourscript.sh
它将创建新的正确文件,然后运行新文件。
答案 3 :(得分:0)
您已经获得了描述如何修复现有脚本的答案:
=
变量时,$files
周围没有空格if
之后的空格,以及条件表达式各部分之间的空格。您的脚本遭受Parsing LS问题的困扰,因为文件名中包含换行符之类的特殊字符可能会受到不好的对待。当您只想检查文件是否存在(例如count == 0)时,虽然您可能认为这不是一个大问题,但是您的操作方式仍然很麻烦,并且会养成不良的习惯
怎么样,请考虑:
while read folder; do
files=0
for files in $folder/*; do
files=1
break
done
if [ $files -eq 0 ]; then
echo "$folder" >> output.txt
else
echo "not empty: $folder" >&2
fi
done
代替使用命令替换和管道计数文件,它使用for
循环来设置信号灯(如果存在任何文件)。这将总是更快。
请注意,这符合POSIX。如果您的shell是更高级的shell(例如bash或zsh),则可以使用更优雅/有效的选项。