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是区分大小写的,它应该被视为单独的。请告诉我我错过了什么..
解决方案
您正在使用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
参考
推荐阅读
- python-3.x - discord.py 定义没有参数的“ctx”
- c++ - 弄清楚如何在 C++ 中将整数读入 ASCII
- javascript - 使用 vue.js 更改要在 ox carousel 中显示的项目
- android - 如何防止截图撤消隐藏状态栏?
- google-cloud-platform - 如何找到 GCP 可用性(对于抢占式 GPU)?
- nginx - Nuxt 不服务 404 但 nginix 是
- tensorflow - 我无法在 Keras 中保存顺序模型
- ruby-on-rails - 单击链接时如何将通知标记为已读?(导轨)
- python - 在函数中运行 try 和 except 并重新运行会导致 NoneType 返回。我该如何解决?
- azure - 无法在 Devops 步骤中设置 powershell 输出变量