2016-07-30 17 views
1

以下のシェルスクリプトは、 'Loading_1_EMP.sql'の代わりに 'Loading_EMP.sql'という名前の出力ファイルを生成する理由を知っていますか?シェル出力ファイルの奇妙な振る舞い(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; 

それを行う必要があり、またはLoading_$JOBID_$TABLEでより良い

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

、シェルtrates $JOBID_単一の変数として、それが設定されていないので、それはLoading_EMP.sql

結果として何も $JOBID_を代入し

Thあなたのために読む必要があります[ answer ]です。

+2

私は今それを理解しています。どうもありがとうございます! – Sigularity

+0

答えを受け入れてくれてありがとう、素晴らしい週末をする;) – sjsam

1

あなたは、JOBID_という名前の変数を参照していると解釈します。名前は{}で囲みます。

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

ファイル名にスペースを入れるために '$ _ {JOBID} _ $ TABLE.sql'を二重引用符で囲むことをお勧めします。 – sjsam

+0

スペースやその他の奇妙な文字がある場合にのみ重要です。彼のスクリプトは明らかにそれに苦しんでいない。 – jackrabbit

1

_はシェルでは特殊文字ではありません。したがって、シェルは、$JOBID_変数をエコーし​​ているときにこれを見ています。これは未定義であり空です。

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