因此,我正在运行 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