Linux .sh在echo时自动将本地变量设置为空

时间:2018-08-02 07:23:50

标签: linux shell sh

./ run.sh:

1. cp=warmonger-1.0.0.jar
2. cmmd="java -server -D64 -Xms200m -Xmx200m 
     -Dlog4j.configurationFile=$WARMONGER_HOME/etc/log4j2.xml
     -classpath $cp warmonger.agent.WarmongerAgentApp"
3. echo $cmmd

执行结果:

dataq.agent.DataqAgentApp -Xmx200m 
  -Dlog4j.configurationFile=/warmonger/etc/log4j2.xml 
  -classpath warmonger-1.0.0.jar

“ warmonger.agent.WarmongerAgentApp”没有出现。

我的意思是,如果删除echo,java将引发异常:找不到主类

2 个答案:

答案 0 :(得分:0)

$cp不会显示echo $cmmd,因为外壳程序将cp参数(warmonger-1.0.0.jar)的值替换为{{1} }。

您可以转义美元符号,如果不希望外壳扩展参数,则可以使用单引号。

答案 1 :(得分:0)

您的外壳程序脚本以CR-LF终止(DOS / Windows行尾)。因此,从bash的角度来看,cp变量包含warmonger-1.0.0.jar<CR>(请注意尾随<CR>)。

当您echo变量的内容cp时,也将回显<CR>,这会将光标置于行的开头(CR =回车)。 echo然后在行首打印其余参数。

您可以在输出中看到它:

  • “ java -server -D64 -Xms200m -Xmx200m”被“ warmonger.agent.WarmongerAgentApp”覆盖
  • 依次由其他一些命令输出(“ dataq.agent.Dataq”)覆盖的

解决方案:将DOS / Windows文本文件转换为UNIX。参见this answer