2016-07-30 22 views
1

你知道为什么在shell脚本下面生成名为'Loading_EMP.sql'而不是'Loading_1_EMP.sql'的输出文件吗?shell输出文件(Linux)的奇怪行为

#!/bin/bash 

JOBID="1" 
TABLE="EMP" 

echo 'test' > Loading_$JOBID_$TABLE.sql; 

# Output 
Loading_EMP.sql 

# Expected Output 
Loading_1_EMP.sql 
+1

[外壳变量插值(可能的重复http://stackoverflow.com/questions/17622106/variable-interpolation-in- shell) – jackrabbit

+0

@jackrabbit:除了可变插值问题,还有一个缺少双引号的问题 – sjsam

回答

3
echo 'test' > Loading_${JOBID}_${TABLE}.sql; 

应该这样做,或更好

echo 'test' > "Loading_${JOBID}_${TABLE}.sql" # to avoid word splitting 

Loading_$JOBID_$TABLE,外壳trates $JOBID_作为一个单一的变量,因为它没有设置,它替换$JOBID_什么也没有造成Loading_EMP.sql


Th是[ answer ]必须为您阅读。

+2

我现在明白了。非常感谢! – Sigularity

+0

感谢您接受答案,然后有一个愉快的周末;) – sjsam

1

解释器认为您指的是名为JOBID_的变量。用{}将名称括起来。

echo 'test' > Loading_${JOBID}_$TABLE.sql 
+1

您可能会考虑用双引号'Loading _ $ {JOBID} _ $ TABLE.sql'来容纳带空格的文件名。 – sjsam

+0

如果你有空间或其他奇怪的字符,这些只是很重要。他的剧本显然不会因此而受到影响。 – jackrabbit

1

_在shell中不是特殊字符。所以shell会在你回应一个$JOBID_变量时看到这个,它是未定义的,因此是空的。相反,你应该明确地显示壳的变量是什么,通过使用{}

echo 'test' > Loading_${JOBID}_${TABLE}.sql; 
# Here -----------------^-----^--^-----^