首页 > 解决方案 > 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是区分大小写的,它应该被视为单独的。请告诉我我错过了什么..

标签: shellunix

解决方案


您正在使用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

参考


推荐阅读