我的脚本检查参数是文件还是文件夹
如果是文件,则计算行数
之后,如果行数大于20或更少,他会做一些指示
问题在于这条指令PartialView
我的剧本:
n= cat $a | wc -l
这是执行错误指令的输出
#!/usr/bin/env bash
echo 'Hello this is the test of' `date`
echo 'arguments number is ' $#
if [ $# -eq 4 ]
then
for a in $@
do
if [ -d $a ]
then
ls $a > /tmp/contenu
echo "contenu modified"
elif [ -f $a ]
then
# this instruction must set a numeric value into n
echo "my bad instruction"
n= cat $a | wc -l
echo "number of lines = " $n
# using the numeric value in a test (n must be numeric and takes the number of lines in the current file)
if [ $n -eq 0 ]
then
echo "empty file"
elif [ $n -gt 20 ]
then
echo ` head -n 10 $a `
else
cat $a
fi
else
echo "no file or directory found"
fi
done
else
echo "args number must be 4"
fi
答案 0 :(得分:3)
行n= cat $a | wc -l
是违规行为。永远记住bash
shell脚本非常区分大小写。 shell将您的命令解释为必须运行两个单独的命令
n= cat $a | wc -l
#^^ ^^^^^^^^^^^^^^
#1 2
第一部分只是将一个空字符串存储到变量n
,然后下一个部分打印存储在变量a
中的文件的行数。请注意,shell不会为此抛出错误。因为它没有违反语法(只是语义错误)。但是,行计数永远不会分配给变量n
。
当您与LHS上的空变量进行比较时,会遇到条件if [ $n -eq 0 ]
时出现错误。
您想运行命令并存储其输出,您需要命令替换($(..)
)。假设$a
包含文件的名称,只需执行
n=$(wc -l < "$a")
请注意,我删除了无用的cat
用法并将其用于wc
。但是wc
可以直接从输入流中读取。
另请注意,您的脚本中有多个不良做法。请记住执行以下操作
"$#"
,"$@"
,[ -f "$a" ]
,[ -d "$a" ]
[[
下运行,其中可以使用包含空格的变量而不在LHS上引用bash
醇>