如何利用命令中的用户定义变量在 if 中创建条件

如何利用命令中的用户定义变量在 if 中创建条件

我有一个脚本,它从用户那里获取两个变量的输入。然后,我尝试在命令中使用这些变量,该命令又被输入到 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

您很少(如果有的话)需要解析来自ls

在这种情况下,你可以通过这样做

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 -lvs. 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 扩展为数组并对元素进行计数。

相关内容