bash - 无法从 shell 脚本调用 openscad -D 命令行

标签 bash command-line openscad

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

$ 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=\"$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 在运行命令时失败。

谢谢你的帮助,

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

#!/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

最佳答案

如果您的预期命令行是:

openscad -o name1-name2.stl -D 'param1="name1"' -D 'param2="name2"' openscad-script.scad

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

#!/bin/bash
openscad \
  -o "$1-$2.stl" \
  -D "param1=\"$1\"" \
  -D "param2=\"$2\"" \
  openscad-script.scad

...或者,如果您出于任何原因真的想在多行上构建内容:

#!/bin/bash

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

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 被替换为类似 $1 的内容时,根据所使用的引号类型,其含义会变得非常不同:

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

关于bash - 无法从 shell 脚本调用 openscad -D 命令行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40706467/

相关文章:

python - 使用 * 对 bash 命令进行子处理

linux - 如何在 shell 中获取一年中的某一天?

windows - 如何通过 Batch 使用 WinRAR?

linux - IA 32 读取命令行参数

java - 寻找基于 Java 的 OpenSCAD 和 PLasM 替代方案

for-loop - 如何使用 openscad/for-loop 在立方体上打洞?

bash - 变量中的 dos2unix

linux - 用于查找可执行文件路径的 Bash 脚本

java - 线程 "main"java.lang.NoClassDefFoundError : org/json/simple/JSONObject - java commandline runtime error 中出现异常