[英]Optimize an if statement with multiple elements in bash?
我正在嘗試減少以下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
語句工作正常(至少大寫和小寫,但沒有混合),但它超級冗長的想知道是否有辦法縮小它。
在bash
,你可以啟用擴展選項來做到這一點nocasematch
這不是默認設置,並使用正則表達式運算符~
多個匹配在一個結合起來。
你可以優化它
shopt -s nocasematch
if [[ "${file_extension}" =~ ^(mp4|mts|avi)$ ]]; then
請注意,與用於不區分大小寫的glob擴展(文件名擴展)的nocaseglob
相比,此選項是不同的。 不要使用彼此互換。 請參閱bash
其他shell選項
另一個有用的事情是在完成選項后關閉選項,不要讓選項影響其他條件語句。
shopt -u nocasematch
為了響應OP查詢為什么正則表達式運算符被用於擴展的glob標志@()
,這只是一個偏好問題。 兩者都在這里解決了相同的用例,更多的是我會看到的個人選擇
==
的擴展glob需要默認啟用另一個shell選項作為shopt -s extglob
。 =~
支持ERE,它使用^
和$
支持正則表達式啟動停止位置,並使用|
替換匹配 。 如果您習慣使用正則表達式匹配技巧,請使用此選項。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.