Unix文件扩展名验证失败

时间:2019-03-09 18:10:32

标签: shell unix

我想不到的东西我无法弄清楚。需要一些想法。

我正在尝试仅检查目录中我得到.txt或.TXT的文件扩展名..,但由于我对.txt和.TXT文件执行不同的验证,因此应将两者都视为不同。

我有以下文件

aa.394.63.txt
aa.394.23.TXT

这是我的代码

for file in "$SEARCH_DIR"/*; do
  extn=$(echo $file | awk -F '.' '{print $NF}')
  echo "extn:" $extn
  if [ $extn=="txt" ]; then
     echo "txt Loop"
  elif [$extn=="TXT" ]; then
     echo "TXT loop"
  fi

但是对于“ txt”验证来说,此脚本始终是正确的,永远不会进入“ TXT循环”。.我认为unix是区分大小写的,应将其视为独立..请告知我我缺少什么..

1 个答案:

答案 0 :(得分:2)

您正在以test的形式使用[]来测试您的状况。您必须在方括号和等号运算符周围包含空格。

test手册页中:

  

[是test的同义词,但需要最后一个参数]   ...

     

括号中的空格很重要-每个运算符和操作数必须是一个单独的参数。   https://ss64.com/bash/test.html

这意味着您需要特别注意测试结构中的空格。您还应该注意,在使用[]测试变量时,应给变量加引号,因为它们可能已经分词(在这种情况下不相关,但可能是一个好习惯)。

由于要使用[]来测试条件,而不是使用bash [[]]构造,因此应使用带有空格的单个=来测试字符串是否相等。

以下是您的代码的稍微修改的版本,应该可以使用:

#!/bin/bash

SEARCH_DIR=./search
for file in "$SEARCH_DIR"/*; do
    extn=$(echo $file | awk -F '.' '{print $NF}')
    echo "extn:" "$extn"
    if [ "$extn" = "txt" ]; then
        echo "txt Loop"
    elif [ "$extn" =  "TXT" ]; then
        echo "TXT loop"
    fi
done

参考