无法从 shell 脚本调用 Openscad -D 命令行
Openscad -D command line cannot be called from shell script
我在 Ubuntu linux 上使用 openscad 命令从命令行生成模型。我最终在 运行 openscad 命令中成功使用 -D 参数覆盖变量值:
$ openscad -o output.stl -D 'param1="name1"' -D 'param2="name2"' openscad-script.scad
编辑:注意我们必须传递-D参数的方式,单引号和双引号都必须存在,因为Openscad documentation.
但是当我从 shell 脚本生成并执行相同的命令时,openscad 失败并出现错误:
$ ./myscript.sh value1 value2
ERROR: Parser error in line XX: syntax error Can't parse file
'openscad-script.scad'!
其中 XX = 文件的最后一行。
这是bash脚本
#!/bin/bash
# run openscad command
param1="-D 'param1=\"\"'"
param2="-D 'param2=\"\"'"
echo "openscad -o -.stl $param1 $param2 openscad-script.scad"
openscad -o -.stl $param1 $param2 openscad-script.scad
这看起来很简单我仍然无法弄清楚是什么导致 openscad 在 运行 命令中失败。
感谢您的帮助,
编辑:我找到了一种让它工作的方法,可能不是最好的
#!/bin/bash
# run openscad command
param1="-D 'param1=\"\"'"
param2="-D 'param2=\"\"'"
command = "openscad -o -.stl $param1 $param2 openscad-script.scad"
eval $command
通过写作param1="-D 'param1=\"\"'"
,
我想你稍后 $param1
时会预料到这一点,
当您 运行 openscad ... $param1
命令时,嵌入的双引号将被重新计算。但是不,那不会发生。
为了实现你想要的,一个可行且干净的解决方案是使用 Bash 数组:
#!/bin/bash
params=(-D param1="\"\"" -D param2="\"\"")
printf '%q ' openscad -o "-".stl "${params[@]}" openscad-script.scad; echo
openscad -o "-".stl "${params[@]}" openscad-script.scad
我还用双引号 -
,因为建议防止通配和分词。
如果您想要的命令行是:
openscad -o name1-name2.stl -D 'param1="name1"' -D 'param2="name2"' openscad-script.scad
...那么执行此操作的正确脚本是:
#!/bin/bash
openscad \
-o "-.stl" \
-D "param1=\"\"" \
-D "param2=\"\"" \
openscad-script.scad
...或者,如果您出于任何原因真的想在多行上构建内容:
#!/bin/bash
args=( -o "-.stl" )
args+=( -D "param1=\"\"" )
args+=( -D "param2=\"\"" )
openscad "${args[@]}" openscad-script.scad
openscad
字面上无法知道在命令行中使用的是单引号还是双引号,因此没有强制性的方式要求单引号。而且,shell引号是逐字属性!也就是说:
'param1="name1"' # becomes the C string "param1=\"name1\""
导致完全相同的字符串被传递为:
param1='"name1"' # becomes the C string "param1=\"name1\"", same as above
或
param1='"'name1'"' # becomes the C string "param1=\"name1\"", same as above
...当这些值都是常量时。但是,当 name1
被替换为 </code> 之类的内容时,根据所使用的引号类型,其含义会变得非常不同:</p>
<pre><code>set -- name1; IFS=0123456789
"param1=\"\"" # becomes the C string "param1=\"name1\"", as above
'param1=""' # becomes the C string "param1=\"\"", not substituting name1
# ...and, as an example of something to look out for:
param1='"''"' # becomes TWO C strings, "param1=\"name" and "\"", due to bad quoting
# ...the IFS above makes it split on numbers; by default this risk would happen with spaces
我在 Ubuntu linux 上使用 openscad 命令从命令行生成模型。我最终在 运行 openscad 命令中成功使用 -D 参数覆盖变量值:
$ openscad -o output.stl -D 'param1="name1"' -D 'param2="name2"' openscad-script.scad
编辑:注意我们必须传递-D参数的方式,单引号和双引号都必须存在,因为Openscad documentation.
但是当我从 shell 脚本生成并执行相同的命令时,openscad 失败并出现错误:
$ ./myscript.sh value1 value2
ERROR: Parser error in line XX: syntax error Can't parse file 'openscad-script.scad'!
其中 XX = 文件的最后一行。
这是bash脚本
#!/bin/bash
# run openscad command
param1="-D 'param1=\"\"'"
param2="-D 'param2=\"\"'"
echo "openscad -o -.stl $param1 $param2 openscad-script.scad"
openscad -o -.stl $param1 $param2 openscad-script.scad
这看起来很简单我仍然无法弄清楚是什么导致 openscad 在 运行 命令中失败。
感谢您的帮助,
编辑:我找到了一种让它工作的方法,可能不是最好的
#!/bin/bash
# run openscad command
param1="-D 'param1=\"\"'"
param2="-D 'param2=\"\"'"
command = "openscad -o -.stl $param1 $param2 openscad-script.scad"
eval $command
通过写作param1="-D 'param1=\"\"'"
,
我想你稍后 $param1
时会预料到这一点,
当您 运行 openscad ... $param1
命令时,嵌入的双引号将被重新计算。但是不,那不会发生。
为了实现你想要的,一个可行且干净的解决方案是使用 Bash 数组:
#!/bin/bash
params=(-D param1="\"\"" -D param2="\"\"")
printf '%q ' openscad -o "-".stl "${params[@]}" openscad-script.scad; echo
openscad -o "-".stl "${params[@]}" openscad-script.scad
我还用双引号 -
,因为建议防止通配和分词。
如果您想要的命令行是:
openscad -o name1-name2.stl -D 'param1="name1"' -D 'param2="name2"' openscad-script.scad
...那么执行此操作的正确脚本是:
#!/bin/bash
openscad \
-o "-.stl" \
-D "param1=\"\"" \
-D "param2=\"\"" \
openscad-script.scad
...或者,如果您出于任何原因真的想在多行上构建内容:
#!/bin/bash
args=( -o "-.stl" )
args+=( -D "param1=\"\"" )
args+=( -D "param2=\"\"" )
openscad "${args[@]}" openscad-script.scad
openscad
字面上无法知道在命令行中使用的是单引号还是双引号,因此没有强制性的方式要求单引号。而且,shell引号是逐字属性!也就是说:
'param1="name1"' # becomes the C string "param1=\"name1\""
导致完全相同的字符串被传递为:
param1='"name1"' # becomes the C string "param1=\"name1\"", same as above
或
param1='"'name1'"' # becomes the C string "param1=\"name1\"", same as above
...当这些值都是常量时。但是,当 name1
被替换为 </code> 之类的内容时,根据所使用的引号类型,其含义会变得非常不同:</p>
<pre><code>set -- name1; IFS=0123456789
"param1=\"\"" # becomes the C string "param1=\"name1\"", as above
'param1=""' # becomes the C string "param1=\"\"", not substituting name1
# ...and, as an example of something to look out for:
param1='"''"' # becomes TWO C strings, "param1=\"name" and "\"", due to bad quoting
# ...the IFS above makes it split on numbers; by default this risk would happen with spaces