如何在bash脚本中正确使用带有&&和-o的elif

好奇的山姆

Bash版本4.4.20
Ubuntu 16.04

我需要比较我拥有的特定项目的时间和扩展名。下面是与我尝试执行的操作类似的操作,但错误相同。我不确定错误在哪里,因为shellcheck没有产生错误。

#!/bin/bash
#

while read -r filename; do
  extension="${filename##*.}"
  if [ "$extension" == "zip" ] && [ "$filename" == "one.zip" ]; then
    echo "Filename is $filename"
  elif [ "$extension" == "zip" ] && [ "$filename" == "file_1.zip" ] -o [ "$filename" == "file_2.zip" ] -o [ "$filename" == "file_3.zip" ]; then
    echo "Filename is $filename"
  elif [ "$extension" == "csv" ] && [ "$filename" == "two.csv" ]; then
    echo "Filename is $filename"
  else
    echo "Filename is $filename"
  fi
done<fileList.txt  

错误:

Filename is one.zip
check.sh: line 8: [: too many arguments
Filename is file_1.zip
check.sh: line 8: [: too many arguments
Filename is file_2.zip
check.sh: line 8: [: too many arguments
Filename is file_3.zip
Filename is two.csv
Filename is three.sql
切普纳

使用模式匹配来发挥您的优势:

while IFS= read -r filename; do
  if [[ "$filename" = one.zip ]; then
    echo "Filename is $filename"
  elif [[ "$filename" = file_[123].zip ]; then
    echo "Filename is $filename"
  elif [[ "$filename" = two.csv ]; then
    echo "Filename is $filename"
  else
    echo "Filename is $filename"
  fi
done < fileList.txt

一条case语句将在任何POSIX shell中运行,而不仅仅是支持bash-like[[ ... ]]命令的shell

while IFS= read -r filename; do
  case $filename in
    one.zip) echo "Filename is $filename" ;;
    file_[123].zip) echo "..." ;;
    two.csv) echo "..." ;;
    *) echo "..." ;;
  esac
done

要匹配年份范围(?),可以使用

case $value in
  200[0-9]|201[0-9]|202[0-1]) echo "Year between 2000 and 2021" ;;
esac

你不能这样做,因为简单地用[[ value = ... ]],因为|是部分case语句的语法,而不是在模式的交替操作。相反,您将需要多个匹配运算符:

if [[ $value = 200[0-9] || $value = 201[0-19] || $value = 202[0-1] ]]; then

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章