为什么在if语句中的Bash变量为空是空的,但不在if语句之外?

时间:2017-12-11 19:21:23

标签: linux bash shell rhel7

cat > variables.sh << EOF1
#!/bin/bash
echo "Please enter your first name:"
read -e -i "Bob" FIRST_NAME
echo "Please enter your last name:"
read -e -i "Marley" LAST_NAME

echo "First name: $FIRST_NAME"
echo "Last name: $LAST_NAME"
if [[ "$FIRST_NAME" == "Bob" ]] ; then
echo "Last name: $LAST_NAME"
fi
EOF1
source ./variables.sh

运行上述结果:

First name: Bob
Last name: Marley
Last name:

由于某种原因,if语句中的LAST_NAME变量为空。但是,如果我打电话

echo "Last name: $LAST_NAME"
脚本运行后手动

我看到:

Last name: Marley

所以,我知道变量实际上包含姓氏。

它的作用就好像if语句中的上下文不同于if语句之外的上下文。那是准确的吗?

我该怎样做才能使我的工作方式符合预期(if语句中的$ LAST_NAME包含姓氏)?

我正在RHEL7上测试它。

2 个答案:

答案 0 :(得分:3)

使用here-doc

cat > variables.sh <<-'EOF1'
#!/bin/bash
echo "Please enter your first name:"
read -e -i "Bob" FIRST_NAME
echo "Please enter your last name:"
read -e -i "Marley" LAST_NAME

echo "First name: $FIRST_NAME"
echo "Last name: $LAST_NAME"
if [[ "$FIRST_NAME" == "Bob" ]] ; then
echo "Last name: $LAST_NAME"
fi
EOF1

EOF1中使用引号可以防止在当前shell中扩展$变量。

根据man bash

  

不对字执行参数和变量扩展,命令替换,算术扩展或路径名扩展。如果          单词的任何部分都是引用,分隔符是单词上引号删除的结果,而here-document中的行不是          扩大。如果word不加引号,则here-document的所有行都要进行参数扩展,命令替换和          算术扩展,字符序列\被忽略,\必须用于引用字符\$`

答案 1 :(得分:2)

我不确定为什么第一个echo语句对你起作用而不是第二个 - 当我尝试你的脚本时,我都失败了。但如果你做了一些细微的改动,你可以解决问题。

anubhava 所述,您的变量值将立即执行,不会传递到目标脚本中。你需要用反斜杠逃脱它们。此外,没有必要在if语句中使用[[和]]:每个语句中都有1个。在if语句中也可以使用单个等号(=)。

所以如果你想要你想要的variables.sh脚本:

#!/bin/bash
echo -n "Please enter your first name: "
read -e -i "Bob" FIRST_NAME
echo -n "Please enter your last name: "
read -e -i "Marley" LAST_NAME

echo "First name: $FIRST_NAME"
echo "Last name: $LAST_NAME"
if [ "$FIRST_NAME" = "Bob" ]; then
    echo "Last name: $LAST_NAME"
fi

你应该制作你的初始剧本:

cat > variables.sh << EOF1
#!/bin/bash
echo -n "Please enter your first name: "
read -e -i "Bob" FIRST_NAME
echo -n "Please enter your last name: "
read -e -i "Marley" LAST_NAME

echo "First name: \$FIRST_NAME"
echo "Last name: \$LAST_NAME"
if [ "\$FIRST_NAME" = "Bob" ]; then
    echo "Last name: \$LAST_NAME"
fi
EOF1
source ./variables.sh

那应该可以解决你的问题。这是我的输出:

Please enter your first name: Bob
Please enter your last name: Marley
First name: Bob
Last name: Marley
Last name: Marley

注意:我还在echo语句的末尾添加了“-n”选项和引号内的空格。这将取消换行,并允许您在提示符的同一行输入答案。