加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 综合聚焦 > 服务器 > 安全 > 正文

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

发布时间:2020-12-15 22:04:10 所属栏目:安全 来源:网络整理
导读:我在Ubuntu linux上使用openscad命令从命令行生成模型.我最终成功运行了openscad命令,使用-D参数覆盖变量值: $openscad -o output.stl -D 'param1="name1"' -D 'param2="name2"' openscad-script.scad 编辑:注意我们必须传递-D参数的方式,单引号和双引号必
我在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="$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

这看起来很简单,我仍然无法弄清楚opencad在运行命令时失败的原因.

谢谢你的帮助,

编辑:我发现了一种让它工作的方法,可能不是最好的

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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读