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上测试它。
答案 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”选项和引号内的空格。这将取消换行,并允许您在提示符的同一行输入答案。