我用谷歌搜索了这个,但我无法弄清楚为什么Bash抱怨以下代码来检查目录是否存在:
test.mk
#!/bin/bash
MYDIR="dl"
all:
if [ ! -d $MYDIR ]; then
#if [ ! -d "${MYDIR}" ]; then
#if [ ! -d ${MYDIR} ]; then
#Here
fi
make -f test.mk
if [ ! -d YDIR ]; then
/bin/sh: Syntax error: end of file unexpected
make: *** [all] Error 2
有人知道它失败的原因吗?为什么它调用/ bin / sh而不是/ bin / bash?谢谢。
编辑:与Bash不同,make不支持多行块。这是工作代码:
MYDIR="dl"
all:
if [ ! -d ${MYDIR} ]; then\
echo "Here";\
else\
echo "There";\
fi
答案 0 :(得分:4)
您在顶部插入的#!/bin/bash
shebang是无用的,make
将其视为评论。
make
默认将命令发送到/bin/sh
。要指定其他shell,请使用宏SHELL = /bin/bash
。
此外,您需要转义变量:
if [ ! -d ${MYDIR} ]
我不确定make
是否可以处理多行语句,因此请尝试将所有if
块放在一行中。
if [ ! -d ${MYDIR} ]; then DO_SOMETHING; DO_SOMETHING_ELSE; fi
答案 1 :(得分:3)
您正在向test.mk
提供make
,而不是bash
。然后make
将单独的行发送到shell,而不是整个块。
make
使用其SHELL
宏来确定要使用的shell。您可以覆盖它以使其bash
。
您获得YDIR
的原因是make
对变量插值有愚蠢的规则。写$(MYDIR)
,而不是$MYDIR
。
答案 2 :(得分:0)
尝试支撑你的变量:
${MYDIR}