我有一个脚本,它从用户那里获取两个变量的输入。然后,我尝试在命令中使用这些变量,该命令又被输入到 if 中的条件中。但是,用户输入值没有替换我的变量,因此我的命令不起作用 -
# Get acl and dc values
echo "Type the ACL name:"
read acl
echo "Type the DATACENTER name"
read dc
# see if sw-list-cisco file exists in ~/$acl directory"
if [ ` ls -1 ~/$acl/sw-list-cisco > /dev/null | wc -l ` -gt 0 ];
then
echo "Going to do something"
else
echo "no match !!!!!!!!!!!!!"
fi
该if [ ` ls -1 ~/"$acl"/sw-list-cisco > /dev/null | wc -l ` -gt 0 ];
条件似乎没有用用户输入值替换 $acl 。我已经手动验证sw-list-cisco
该目录中是否存在~/$acl
。我缺少什么?
答案1
在这种情况下,你可以通过这样做
if [ -f "$HOME/$acl/sw-list-cisco" ]; then
我正在使用-f
测试来测试给定名称是否存在并且是常规文件的名称。我正在使用$HOME
而不是~
因为~
不作为引号内的变量(并且$HOME
更具描述性,恕我直言)。
答案2
if [ ` ls -1 ~/$acl/sw-list-cisco > /dev/null | wc -l ` -gt 0 ];
ls
您将to的输出重定向/dev/null
,因此什么也不会发生wc
,并且它始终会打印0
。如果您手动尝试,则相同:ls / >/dev/null | wc -l
vs. ls / | wc -l
.
您可能想重定向错误从ls
到/dev/null
改为:
if [ $(ls ~/"$acl/sw-list-cisco" 2>/dev/null | wc -l) -gt 0 ];
(-1
当输出进入管道时不需要。)
但由于它只是一个文件,[ -f ~/"$acl/sw-list-cisco" ]
因此会更容易地完成@Kusalananda 已经回答了。即使您想要对文件进行计数,最好将 glob 扩展为数组并对元素进行计数。