bash脚本if / else不区分大小写的答案

时间:2018-05-21 18:54:33

标签: bash

我在bash脚本中有一个if / else语句,询问是否要从快照ID创建EBS卷。

我想创建一个类似if [ "$from_snapshot" -eq "Y|y" ]的行,但我认为这不会起作用。

这就是我所拥有的:

  if [ "$from_snapshot" -eq "Y" ]
    then
      echo "Enter Snapshot ID: "
      read -r snapshot_id
   elif "$from_snapshot" -eq "y"
      echo "Enter Snapshot ID: "
      read -r snapshot_id
   else 
      echo "No Snapshot Required"
   fi

如果有什么办法我可以更简洁地说明这一点?

2 个答案:

答案 0 :(得分:5)

test (aka [)中的-eq运算符用于算术比较。那肯定不是你想要的;您正在尝试进行字符串比较,即=运算符。 (Bash允许您将其键入==,但=符合标准要求。)

使用bash,你最好使用[[ conditional command,它允许" glob"样式模式比较(如果需要,还可以使用正则表达式)。所以你可以使用

if [[ "$from_snapshot" = [Yy] ]]; then 

注意:[Yy]附近加上引号。引用它将使其成为文字字符串而不是模式。

答案 1 :(得分:2)

在更一般的情况下,您可以使用执行逻辑OR的-o选项:

if [ \( "$from_snapshot" = "Y" \) -o \( "$from_snapshot" = "y" \) ]
then
  echo "Enter Snapshot ID: "
  read -r snapshot_id
else 
  echo "No Snapshot Required"
fi

或者您可以在它们之间使用||进行多次测试:

if [ "$from_snapshot" = "Y" ] || [ "$from_snapshot" = "y" ]
then
  echo "Enter Snapshot ID: "
  read -r snapshot_id
else 
  echo "No Snapshot Required"
fi