优化bash中包含多个元素的if语句?

时间:2018-06-25 06:27:01

标签: bash shell

我正在尝试减小下面的if语句的大小。

if [[ "$file_extension" == "MP4" ]] || [[ "$file_extension" == "mp4" ]] || [[ "$file_extension" == "MTS" ]] || [[ "$file_extension" == "mts" ]] [[ "$file_extension" == "AVI" ]] || [[ "$file_extension" == "avi" ]]
then
    echo 'Filesize of '"\"$filename_ext_only\""' before compression was '"$old_file_size"'' >> massCompressResults.txt
    ffmpeg -i "$fileNameWithPath" -c:v libx265 -preset ultrafast -c:a copy "$newfile" < /dev/null

与Windows不同,Ubuntu似乎对大写和小写都严格要求,所以我想知道是否存在一种使用bash来获取扩展名的方法,而不管大小写如何(例如MP4,mp4,Mp4),并且仍然有程序对其进行处理(在这种情况下) ffmpeg)

我的if语句可以正常工作(至少适用于大写和小写,但不能混合使用),但是它的冗长冗长在想是否可以缩小它。

1 个答案:

答案 0 :(得分:3)

bash中,您可以启用扩展选项来执行此nocasematch,这默认情况下 设置,并使用正则表达式运算符~来组合多个匹配项合二为一。

您可以将其优化为

shopt -s nocasematch
if [[ "${file_extension}" =~ ^(mp4|mts|avi)$ ]]; then

请注意,与用于不区分大小写的全局扩展(文件名扩展)的nocaseglob相比,此选项有所不同。 可以互换使用。参见Additional shell options in bash

另一有用的操作是一旦使用完该选项就将其关闭,以免该选项影响其他条件语句。

shopt -u nocasematch

响应OP关于在扩展的glob标志@()上使用正则表达式运算符的疑问,这只是一个优先事项。两者都在这里解决相同的用例,我会看到

  1. 带有==的扩展glob需要另一个外壳程序选项默认启用为shopt -s extglob
  2. =~支持ERE,后者使用^$支持正则表达式起始停止位置,并使用|进行替代匹配。因此,如果您愿意使用正则表达式匹配技巧,请使用它。