检查命令参数的扩展?

检查命令参数的扩展?

因此,我正在运行 Ubuntu,我想要做的是检查是否$1$2某些扩展以及它们是否存在。如果它们不存在或扩展名错误,则脚本结束。如果它们正确,则它继续执行代码。

v1="$1"  
v2="$2"  

if [[ ! "$1"="*.txt" || "$2"="*.dat" || -e "$1" ]]; then  
echo "The file is ending"  
exit  
fi  

echo "Starting rest of code" 

这就是我希望它工作的方式。基本上,它将 v1 和 v2 分配给它们相应的命令参数。然后它运行 if 语句以查看它们是否满足要求。例如,如果$1不是.txt文件或如果$2不是.dat文件或$1不存在,则它退出并显示The File is ending。但是,如果它们确实满足要求,则代码继续并显示Starting rest of code

就目前情况而言,即使输入了正确的文件,它也不会继续。相反,无论如何它都会退出。

答案1

你做错的是将 $1 与 '.txt' 进行检查,其中 $1 不仅包含扩展名,还包含整个文件的名称。例如,如果有一个名为

file1.txt

那么 $1 将保持file1.txt为不等于 的值.txt

您应该做的是先从 $1 获取文件的扩展名,然后根据类型检查它们(不带点)

v1="$1"
v2="$2"
ext1=${v1##*.}
ext2=${v2##*.}
if [ "$ext1" != "txt" ] || [ "$ext2" != "dat" ] || [ ! -e "$1" ]; then
echo "The file is ending"
exit
fi
echo "Starting rest of code"

答案2

尝试利用该basename命令。

#!/bin/sh

if [ "$(basename $1 .txt)" = "$1" -o "$(basename $2 .dat)" = "$2" ]; then
    echo "the file is ending" >&2
    exit 1
fi

echo "starting rest of code"

该代码片段尝试剥离给定的扩展名,并将剥离后的版本与原始版本进行比较:如果没有变化,则文件名不具有给定的扩展名。请注意反转的逻辑(如果字符串相等,则文件名不具有给定的扩展名)不是具有给定的扩展名)。

此解决方案适用于标准 shell 或 bash。

答案3

您可以使用=~运算符进行正则表达式匹配:

#!/bin/bash
v1="$1"
v2="$2"
pat1='.*\.txt$'
pat2='.*\.dat$'
if [[ ! ($v1 =~ $pat1 && $v2 =~ $pat2 && -e $v1) ]]; then
    echo Ending program
    exit
fi
echo Continuing program

相关内容