Bash if else
我们可以在shell脚本的任何部分中使用bashif else
,例如for循环,while循环,函数等。
可以使用if..elif..else
进行进一步增强,如果使用则嵌套,可以在本教程指南中介绍所有可能的情况。
我将尽我所能进行描述,以便即使是绝对的初学者也可以理解并开始在他们的脚本中使用它。
"但是我们必须熟悉以下两个主题"
如何在两个或者多个字符串之间进行比较
如何在两个或者多个整数或者数字之间执行比较
在大多数情况下,我们将通过if
语句结束使用这些条件运算符
if..fi语句
最基本的" if"语句将具有单个条件。
语法
使用此语句的"语法"为:
if [CONDITION] then COMMAND fi
"一种衬里语法"将是:
if [CONDITION]; then COMMAND1; COMMAND2; fi
我们可以将" CONDITION"替换为需要决定的任何种类的支票
如果
CONDITION
返回TRUE
,即SUCCESS
,那么将执行COMMAND
如果
CONDITION
返回FALSE
,即FAILED
,那么这将无济于事,因为我们没有任何else
语句CONDITION其中是强制性的,现在CONDITION可以是很多东西,基本上需要一个DECISION。
Shell脚本示例
让我们看一些shell脚本示例以正确理解这一点:
在此脚本中,我定义了两个变量,并为两个变量分配了一个数字
我们要检查" VAR1"是否大于或者等于" VAR2",因此我们将比较运算符用于数字
# cat /tmp/shell_script.sh #!/bin/bash VAR1=10 VAR2=5 if [[ $VAR1 -ge $VAR2 ]] then echo "$VAR2 is less than or equal to $VAR1" fi
确保我们授予脚本可执行权限
# chomd u+x /tmp/shell_script.sh
执行脚本并验证输出:
# /tmp/shell_script.sh 5 is less than or equal to 10
该脚本的"一个内衬版本"为:
# VAR1=10; VAR2=5; if [[ $VAR1 -ge $VAR2 ]]; then echo "$VAR2 is less than or equal to $VAR1"; fi 5 is less than or equal to 10
if..else..fi语句
我建议始终尽可能使用else语句,因为" ELSE"条件表示"失败"情况。
语法
我将通过一些示例对此进行解释,但首先让我们检查一下bash中是否使用if..else..fi的语法。
if [CONDITION] then SUCCESS_COMMAND else FAILED_COMMAND fi
一个衬里
语法是这样的:
if [CONDITION]; then SUCCESS_COMMAND ; else FAILED_COMMAND ; fi
语法类似于if..fi语句,唯一的区别是现在我们还有一个else语句。
因此,如果CONDITION为TRUE,则将执行SUCCESS_COMMAND
如果CONDITION为FALSE,则将执行FAILED_COMMAND
当我们说" TRUE"和" FALSE"时,表示条件的退出码应为" 0"为" TRUE",非零值为" FALSE"。
Shell脚本示例1
让我们使用比较运算符"增强"最后一个示例,但是这次我们将修改变量值:
#!/bin/bash VAR1=10 VAR2=50 if [[ $VAR1 -ge $VAR2 ]] then echo "exit_status is: $?" echo "$VAR2 is less than or equal to $VAR1" else echo "exit_status is: $?" echo "$VAR2 is greater than or equal to $VAR1" fi
该脚本的输出:
exit_status is: 1 50 is greater than or equal to 10
CONDITION正在检查$VAR1是否大于等于$VAR2.
由于此脚本中的" VAR1"大于" VAR2",因此条件变为" FALSE",即非零退出代码
因此,对于" FALSE"条件,将执行" else"语句
Shell脚本示例2
让我们以一个"实际的"示例为例,在此脚本中,我们尝试在"/opt"中以" data_file"的名称定位文件
#!/bin/bash FILE=`find /opt -name data_file -type f` # Check if FILE variable is empty or not if [[ ! -z $FILE ]] then echo "exit_status is: $?" echo "$FILE variable is not empty, which means file found" echo "File path: $FILE" else echo "exit_status is: $?" echo "$FILE variable is empty, so file not found" fi
在此脚本中,我们将
在/opt下找到名为data_file的文件。
将找到的文件的路径存储在
FILE
变量中如果找到文件,则FILE变量的长度将为非零,因此我们将使用-z进行验证。
如果我们不熟悉此内容,我会"建议"阅读有关比较运算符的信息使用if..else..fi语句检查find命令的状态
脚本在"成功"情况下的输出,即在"/opt"下找到文件时
exit_status is: 0 $FILE variable is not empty, which means file found File path: /opt/data_file
Shell脚本示例3
现在,在此示例中,我们已将路径存储到变量中,仅当我们要处理找到的文件时才需要此路径。
如果只想检查文件是否存在,则可以在" if"条件下使用" find"命令:
if find /opt -name data_file -type f >& /dev/null then echo "exit_status is: $?" echo "$FILE variable is not empty, which means file found" echo "File path: $FILE" else echo "exit_status is: $?" echo "$FILE variable is empty, so file not found" fi
所以我在if语句中运行完整的find命令,而不是将其存储在variable中。
确保将这样的命令的输出发送到NULL
(>&/dev/null
),否则我们将在屏幕上看到看起来不太好的输出
if..elif..else..fi陈述
我们可以使用elif
在if..else语句之间添加多个条件。
语法
使用这个的语法是:
if CONDITION_1 then COMMAND elif CONDITION_2 then COMMAND .. else COMMAND fi
我们可以根据需要在if..else
语句之间的代码块中添加多个elif
。
" else"语句是可选的,我们可以选择仅使用" if..elif..fi"
if CONDITION_1 then COMMAND elif CONDITION_2 then COMMAND .. fi
Shell脚本示例1
该检查将按照从上到下的"顺序"顺序进行,因此我们应相应地以相同顺序放置条件。
让我们用一些shell脚本示例评估
if..elif..else..if
语句:在此脚本中,我有两个变量,即" VAR1"和" VAR2",这两个变量我都分配了相同的值
现在在if条件下,我将检查$VAR1是否大于或者等于$VAR2.
在
elif
块中,我将检查$VAR1是否等于$VAR2.如果条件if和条件elif返回FALSE,则执行else块。
#!/bin/bash VAR1=10 VAR2=10 if [[ $VAR1 -ge $VAR2 ]] then echo "exit_status is: $?" echo "$VAR2 is less than or equal to $VAR1" elif [[ $VAR1 -eq $VAR2 ]] then echo "exit_status is: $?" echo "$VAR2 is equal to $VAR1" else echo "exit_status is: $?" echo "$VAR2 is greater than or equal to $VAR1" fi
该脚本的输出
exit_status is: 0 10 is less than or equal to 10
所以第一个条件是TRUE,因为VAR1大于或者等于VAR2.
"你注意到我其中犯的错误了吗。
"
我在if和elif块中添加了重复条件。
这是我之前试图强调的事情,bash将按顺序执行此操作,因此我们应该知道如何设置条件
如果VAR1和VAR2相等,则将永远不会调用elif块,因为在if条件下将匹配
正确的方法是在if条件中使用-gt来检查是否大于,或者创建单独的if..fi块仅检查VAR1和VAR2是否为平等的
Shell脚本示例2
这个shell脚本示例还使用了多个if
和elif
块
#!/bin/bash VAR1=10 if [[ $VAR1 -eq 5 ]] then echo "exit_status is: $?" echo "$VAR1 is equal to 5, matched in if block" elif [[ $VAR1 -eq 10 ]] then echo "exit_status is: $?" echo "$VAR1 is equal to 10, matched in elif block" else echo "$VAR1 is neither equal to 5 nor 10, no match found" fi
条件是尝试匹配" VAR1"是某个值,并根据匹配结果,将执行相应的块。
该脚本的输出:
exit_status is: 0 10 is equal to 10, matched in elif block
请对" if"和" elif"块进行"注意",对于要执行的各个块,"条件"应为"真"。
如果"条件"为"假",则将执行"其他"块。
嵌套if语句
如果也可以将" if"条件放在另一个" if..elif..else..fi"块中。
语法
使用"嵌套的if"条件的语法与之前的相同,我们只需要在" COMMAND"的现有部分内添加" if"块即可。
if CONDITION_1 then if [ CHILD_CONDITION_1 ] then NESTED_COMMAND elif [ CHILD_CONDITION_1 ] then NESTED_COMMAND .. fi elif CONDITION_2 then if [ CHILD_CONDITION_1 ] then NESTED_COMMAND elif [ CHILD_CONDITION_1 ] then NESTED_COMMAND .. fi .. else COMMAND fi
这里使用elif
和else
是可选的,为了更好的理解,我只是将其放在那里。
我们可以选择仅使用嵌套嵌套,不带" elif"和" else"块
Shell脚本示例
让我们通过一些shell脚本示例更好地理解这一点:
在此脚本中,我将提示
user
提供一些数字作为输入,并用空格字符分隔我们将把这个输入存储到NUM变量中
然后,我们将检查NUM是否为空,不使用第一个if条件
如果NUM为空,即用户未提供任何输入,则将执行else条件。
如果用户提供了一些输入,那么我们将在主" if块"下再次创建" nested if块"。
此"嵌套的条件"条件将计算" NUM"变量中可用的数字
我用过wc -w来计数NUM变量中的单词数
然后基于此值,我将检查" NUM"变量中的单词数是否等于1或者2或者3或者大于3或者大于3,分别位于嵌套的if..elif..elif..else`块
#!/bin/bash read -r -p "Enter a list of numbers separated by whitespace char: " NUM if [[ ! -z $NUM ]] then echo "Good, the user has provided some input" echo "But how Jan words has user given as input?, Let me check" WORD_COUNT=`echo $NUM | wc -w` if [ $WORD_COUNT -eq 1 ];then echo "User has given one number as input" elif [ $WORD_COUNT -eq 2 ];then echo "User has given two numbers as input" elif [ $WORD_COUNT -eq 3 ];then echo "User has given three numbers as input" else echo "User has given more than 3 numbers as input" fi else echo "$NUM is empty, did you provide any input?" fi
当我输入3个以上的输入字时,此脚本的输出
Enter a list of numbers separated by whitespace char: 1 2 3 4 Good, the user has provided some input But how Jan words has user given as input?, Let me check User has given more than 3 numbers as input
如果"我不提供任何输入",则此脚本的输出
Enter a list of numbers separated by whitespace char: $NUM is empty, did you provide any input?
如果有多个条件
现在,在上面,每个if..elif
条件只有一个条件。
但是我们也可以在单条件中添加多个条件运算符
语法1:使用方括号
我们可以使用不同的"语法"将多个条件置于单个" if"条件中
if [[ CONDITION_1 || CONDITION_2 ]] || [[ CONDITION_3 && CONDITION_4 ]] then SUCCESS_COMMAND else FAILED_COMMAND fi
我们可以使用||
来放置OR条件,而使用&&来使用AND条件。
根据要求,在上述"语法"中替换这些条件运算符。
我们将在示例脚本中使用此"语法"来比较两个数字
#!/bin/bash read -r -p "Enter first number: " NUM1 read -r -p "Enter second number: " NUM2 if [[ $NUM1 -eq 1 || $NUM -eq 2 ]] || [[ $NUM1 -eq 3 && $NUM2 -eq 4 ]] then echo "SUCCESS" else echo "FAILED" fi
语法2:使用括号
我们也可以使用双括号代替方括号,并使用与方括号类似的条件运算符:
if (( CONDITION_1 || CONDITION_2 )) || (( CONDITION_3 && CONDITION_4 )) then SUCCESS_COMMAND else FAILED_COMMAND fi
我们将在示例脚本中使用此"语法"来比较两个数字
#!/bin/bash read -r -p "Enter first number: " NUM1 read -r -p "Enter second number: " NUM2 if (( $NUM1 -eq 1 || $NUM -eq 2 )) || (( $NUM1 -eq 3 && $NUM2 -eq 4 )) then echo "SUCCESS" else echo "FAILED" fi
语法3:将圆括号与方括号结合使用
第三个语法是括号和方括号的组合:
if [ \( CONDITION_1 -a CONDITION_2 \) -o \( CONDITION_3 -a CONDITION_4 \) ] then SUCCESS_COMMAND else FAILED_COMMAND fi
这里的-a表示AND条件,而-o表示OR条件。
我们可以根据需要选择添加更多块或者仅在这些语法中使用单个块。
在此示例中,我们将使用带有单个括号和花括号的不同条件运算符来比较两个数字的值
#!/bin/bash read -r -p "Enter first number: " NUM1 read -r -p "Enter second number: " NUM2 if [ \( "$NUM1" -eq 1 -a "$NUM2" = 2 \) -o \( "$NUM1" -eq 3 -a "$NUM2" = 4 \) ] then echo "SUCCESS" else echo "FAILED" fi
这是另一个实际示例,我们将要求用户以"是/否"作为"输入"进行确认:最终用户可能会给出"是"或者"是"或者"是" /"否"或者"否"或者不
,因此我们需要处理所有这些答案:
#!/bin/bash read -r -p "Do you want to confirm: " INPUT if [ \( "$INPUT" == "YES" -o "$INPUT" == "Yes" -o "$INPUT" == "yes" \) ] then echo "SUCCESS with Yes" elif [[ $INPUT == "NO" || $INPUT == "No" || $INPUT == "no" ]] then echo "SUCCESS with No" else echo "Unable to identify the answer" fi
在" if"条件下,我们使用" -o"来检查"是"的所有答案中的" OR"条件,而在" elif"条件下,我们使用||
来检查所有条件中的" OR"条件。
回答"否"
如果用户将" INPUT"作为" Yes",则此脚本的输出:
Do you want to confirm: Yes SUCCESS with Yes
如果用户给No作为INPUT,则此脚本的输出:
Do you want to confirm: No SUCCESS with No
此脚本中的输出,其中有一些不受支持的" INPUT"。
Do you want to confirm: None Unable to identify the answer