我想不到的东西我无法弄清楚。需要一些想法。
我正在尝试仅检查目录中我得到.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是区分大小写的,应将其视为独立..请告知我我缺少什么.. >
答案 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