首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法从shell脚本调用Openscad -D命令行

无法从shell脚本调用Openscad -D命令行
EN

Stack Overflow用户
提问于 2016-11-20 16:29:09
回答 2查看 840关注 0票数 4

我在Ubuntu上使用openscad命令从命令行生成模型。最后,我成功地运行了openscad命令,使用-D参数覆盖变量值:

代码语言:javascript
复制
$ openscad -o output.stl -D 'param1="name1"' -D 'param2="name2"' openscad-script.scad

编辑:注意我们必须传递-D参数的方式,根据 Openscad文档必须有单引号和双引号的

但是,当我从shell脚本生成和执行相同的命令时,openscad会出错:

代码语言:javascript
复制
$ ./myscript.sh value1 value2 

错误:解析器错误行XX:语法错误不能解析文件'openscad-script.scad'!

其中XX =最后一行文件。

这是bash脚本

代码语言:javascript
复制
#!/bin/bash
# run openscad command
param1="-D 'param1=\"$1\"'"
param2="-D 'param2=\"$2\"'"
echo "openscad -o $1-$2.stl $param1 $param2 openscad-script.scad"
openscad -o $1-$2.stl $param1 $param2 openscad-script.scad

这看起来如此简单,我仍然不知道是什么使openscad在运行命令时失败的。

谢谢你的帮忙,

编辑:我找到了一个让它工作的方法,可能不是最好的

代码语言:javascript
复制
#!/bin/bash
# run openscad command
param1="-D 'param1=\"$1\"'"
param2="-D 'param2=\"$2\"'"
command = "openscad -o $1-$2.stl $param1 $param2 openscad-script.scad"
eval $command
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-11-20 17:01:27

如果您的目标命令行是:

代码语言:javascript
复制
openscad -o name1-name2.stl -D 'param1="name1"' -D 'param2="name2"' openscad-script.scad

执行此操作的正确脚本是:...then:

代码语言:javascript
复制
#!/bin/bash
openscad \
  -o "$1-$2.stl" \
  -D "param1=\"$1\"" \
  -D "param2=\"$2\"" \
  openscad-script.scad

...or,如果出于任何原因,您确实希望在多个行上进行构建:

代码语言:javascript
复制
#!/bin/bash

args=( -o "$1-$2.stl" )
args+=( -D "param1=\"$1\"" )
args+=( -D "param2=\"$2\"" )

openscad "${args[@]}" openscad-script.scad

openscad根本无法知道命令行中是否使用了单引号或双引号,因此没有可强制执行的方法来要求单引号。此外,shell引用是一个逐字符的属性!这就是说:

代码语言:javascript
复制
'param1="name1"' # becomes the C string "param1=\"name1\""

结果,传递的字符串与以下字符串完全相同:

代码语言:javascript
复制
param1='"name1"' # becomes the C string "param1=\"name1\"", same as above

代码语言:javascript
复制
param1='"'name1'"' # becomes the C string "param1=\"name1\"", same as above

...when这些值都是常量。然而,当name1被替换为类似于$1的内容时,根据所使用的引号类型,含义会有很大的不同:

代码语言:javascript
复制
set -- name1; IFS=0123456789
"param1=\"$1\"" # becomes the C string "param1=\"name1\"", as above
'param1="$1"'   # becomes the C string "param1=\"$1\"", not substituting name1

# ...and, as an example of something to look out for:
param1='"'$1'"'  # 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
票数 5
EN

Stack Overflow用户

发布于 2016-11-20 16:35:43

通过编写param1="-D 'param1=\"$1\"'",我想您预期以后在运行openscad ... $param1命令时,当您运行openscad ... $param1命令时,嵌入的双引号将被重新计算。但不,那不会发生的。

要实现您想要的结果,一个可行且干净的解决方案是使用一个Bash数组:

代码语言:javascript
复制
#!/bin/bash
params=(-D param1="\"$1\"" -D param2="\"$2\"")
printf '%q ' openscad -o "$1-$2".stl "${params[@]}" openscad-script.scad; echo
openscad -o "$1-$2".stl "${params[@]}" openscad-script.scad

我还双引号$1-$2,因为它是建议的,以防止全球化和分词.

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40706467

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档