你知道为什么在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
你知道为什么在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
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 ]必须为您阅读。
我现在明白了。非常感谢! – Sigularity
感谢您接受答案,然后有一个愉快的周末;) – sjsam
解释器认为您指的是名为JOBID_
的变量。用{}
将名称括起来。
echo 'test' > Loading_${JOBID}_$TABLE.sql
您可能会考虑用双引号'Loading _ $ {JOBID} _ $ TABLE.sql'来容纳带空格的文件名。 – sjsam
如果你有空间或其他奇怪的字符,这些只是很重要。他的剧本显然不会因此而受到影响。 – jackrabbit
_
在shell中不是特殊字符。所以shell会在你回应一个$JOBID_
变量时看到这个,它是未定义的,因此是空的。相反,你应该明确地显示壳的变量是什么,通过使用{}
:
echo 'test' > Loading_${JOBID}_${TABLE}.sql;
# Here -----------------^-----^--^-----^
[外壳变量插值(可能的重复http://stackoverflow.com/questions/17622106/variable-interpolation-in- shell) – jackrabbit
@jackrabbit:除了可变插值问题,还有一个缺少双引号的问题 – sjsam