Shell脚本:比较两个文件和字符串匹配问题:此比较的参数永远不能相等

pbwdgjma  于 2022-11-16  发布在  Shell
关注(0)|答案(1)|浏览(200)

给定的文件结构:

~/
 |__compressed_files/
 |__student_id

其中compressed_files包含.zip.rar.tar.gz.dika文件格式。
为简单起见:
student_id文件类似于:

A00003
A00001
A00002
A00004
A00005
...

compressed_files/目录类似于:

A00002.dika
A00004.zip
A00003.rar
A00001.tar.gz
...

compressed_filesstudent_list内容都是随机列出的,而不是以数字形式列出的。
第一步
我想使用student_id文件列表找出:
未上交文件,归类为missing_list
提交错误的文件格式,即.dika文件格式,归类为wrong_list
预期结果将是:
missing_list

A00005
...

wrong_list

A00002
...

预期结果文件结构如下:

~/
 |__compressed_files/
 |__student_id
 |__missing_list
 |__wrong_list

下面是我的解决方案:
使用嵌套的for循环,通过检查文件格式来检查student_list中的id是否存在于compressed_files中。

#! /bin/bash
# Create missing_list and wrong_list in ~/ directories :
touch ~/missing_list  ~/wrong_list

# Use student_id file to compare with compressed_files :
for i in $(more ~/student_id)
do
    for j in $(ls -l ~/compressed_files/ | awk -F  ' '  '{print $9}')
    do
        if [[ "$i" == "$j | $(awk -F '.' '{print $1}' ~/compressed_files)" && "$j | $(awk -F '.' '{print $2}' ~/compressed_files)" == "dika" ]]
        then
                echo "$j" >> wrong_list
        elif [[ "$i" == "$j | $(awk -F '.' '{print $1}' ~/compressed_files)" ]]
        then
                true
        else
                echo "$i" >> missing_list
        fi
    done
done

$j | $(awk -F '.' '{print $1}' ~/compressed_files)类似于A00002.dikaA00002
$j | $(awk -F '.' '{print $2}' ~/compressed_files)类似于A00002.dikadika
我用https://www.shellcheck.net/去检查,却发现==下面出现了$j | $(awk -F '.' '{print $2}' ~/compressed_files)" == "dika" ]]的提示:

^-- SC2193 (warning): The arguments to this comparison can never be equal. Make sure your syntax is correct.

我检查了错误的消息,并搜索了一些语法问题,如[[[$()${}或字符串匹配问题,但无法得到我所期望的。
抱歉冗长的描述,但我只是想把我的问题清楚。
有没有人可以帮我,并根据我的脚本更正?谢谢!

wwodge7n

wwodge7n1#

  • "$j | $(awk -F '.' '{print $1}' ~/compressed_files)"* 和 "$j | $(awk -F '.' '{print $2}' ~/compressed_files)" 分别是获取基本名称和扩展名的复杂尝试,它们不起作用,因为引用管道时不解释。可以使用Shell Parameter Expansion"${j%.*}""${j#*.}"

相关问题