首页 > 解决方案 > Bash 脚本没有将 Javascript 命令保留到 EOF

问题描述

我正在尝试使用 bash 脚本在 bash 脚本中生成一个文件EOF。该文件正在正确生成,但是我在其中定义变量的一段 javascript 代码被遗漏了并且代码错误:

Javascript/Bash 代码片段

cat << EOF > map.php
$( "#slider" ).slider({
  value:60,
min: 1.0,
max: 100.0,
  animate: true,
animate: 500,
slide: function( event, ui ) {
   historicalOverlay.setOpacity( ui.value/100 );
     }
});
EOF

结果

.slider({
  value:60,
min: 1.0,
max: 100.0,
  animate: true,
animate: 500,
slide: function( event, ui ) {
   historicalOverlay.setOpacity( ui.value/100 );
     }
});

标签: javascriptbash

解决方案


here-document的所有行都经过参数扩展、命令替换和算术扩展。

该序列$( "#slider" )是命令替换。shell 运行#slider(这是一个无操作,因为它代表一个注释)并将序列替换为命令的输出(无输出)。

如果您希望您的脚本逐字输出 JS 的片段,您可以将 here-document 的分隔符放在单引号中:

cat << 'EOF' > map.php
$("#slider").slider({
  value:60,
  min: 1.0,
  max: 100.0,
  animate: true,
  animate: 500,
  slide: function( event, ui ) {
    historicalOverlay.setOpacity( ui.value/100 );
  }
});
EOF

这告诉 shell 不要在文本中扩展任何特殊序列。

如果 JS 代码包含需要替换的部分(参数、命令等),您可以让分隔符不加引号,并注意转义任何标记扩展或替换的字符。

应用于上面的代码,这会导致:

cat << EOF > map.php
\$("#slider").slider({
  value:60,
  min: 1.0,
  max: 100.0,
  animate: true,
  animate: 500,
  slide: function( event, ui ) {
    historicalOverlay.setOpacity( ui.value/100 );
  }
});
EOF

推荐阅读