执行脚本时如何处理参数
我的代码是:
#!/bin/bash
DIR="$1"
if [ DIR eq $1 ]
then
echo -n "total directories:" ; find $DIR -type d | wc -l
echo -n "total files:" ; find $DIR -type f | wc -l
else
echo " pass parameters"
fi
当我使用脚本名称 ( ./countfiledirs
) 执行时,它显示为:
./countfiledirs: line 4: [: DIR: unary operator expected
pass parameters
如果我./countfiledirs
在不传递参数的情况下执行,它应该显示如下:
pls pass arguments.
如果我执行 ./countfiledirs 并将参数传递为 ./countfiledirs /usr/share ,它应该显示如下输出:
total directories:145
total files:254
答案1
你的错误在这里:
if [ DIR eq $1 ]
您没有使用变量,这是简单的 string DIR
。你想要的是:
if [ "$DIR" = "$1" ]
但是,由于您正在设置DIR="$1"
,因此根据定义该测试将始终为真。另外,当$1
为空时,$DIR
命令find
也会在当前目录上运行。对于 的许多版本find
,这些命令是等效的:
find . -name foo
find -name foo
如果没有目标目录,find
将搜索.
当前目录。因此,脚本的工作版本将是:
#!/bin/bash
## Avoid using UPPER CASE variable names in bash.
dir="$1"
## Check if $dir exists
if [ -e "$dir" ]
then
printf "total directories: %s\n" $(find "$dir" -type d | wc -l)
printf "total files: %s\n" $(find "$dir" -type f | wc -l)
else
echo " pass parameters"
fi
传递给 bash 脚本的参数数量保存为$#
,所以你也可以这样做
if [ $# -lt 1 ]
then
echo "pass parameters"
exit
fi