我的脚本检查参数是文件还是文件夹(如果它是一个文件),他计算之后的行数,如果行数大于20或更少,他会做一些指令,问题在于这个指令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
这是执行错误指令的输出
my bad instruction
5
number of lines =
ExamenEx2.sh: line 19: [: -eq : opérateur unaire attendu
线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" ]
[[
下运行,可以使用条件表达式bash
,其中可以使用包含空格的变量而不在LHS上引用