4

コマンドラインからモデルを生成するために、Ubuntu Linux で openscad コマンドを使用しています。-D パラメータを使用して openscad コマンドを実行し、変数の値をオーバーライドすることに成功しました。

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

編集: -D パラメータを渡す方法に注意してください。Openscadのドキュメントに従って、一重引用符と二重引用符の両方を使用する必要があります。

しかし、シェル スクリプトから同じコマンドを生成して実行すると、openscad はエラーで失敗します。

$ ./myscript.sh value1 value2 

エラー: 行XXのパーサー エラー: 構文エラー ファイル '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
4

2 に答える 2

5

意図したコマンドラインが次の場合:

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コマンドラインで一重引用符または二重引用符が使用されたかどうかを文字通り知る方法がないため、一重引用符を要求する強制的な方法はありません。しかも、シェルクォートは文字単位の属性!つまり、次のようになります。

'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
于 2016-11-20T17:01:27.400 に答える