मैं कमांड लाइन से मॉडल उत्पन्न करने के लिए Ubuntu linux पर Opencad कमांड का उपयोग कर रहा हूं। मैं चर मानों को ओवरराइड करने के लिए -D मापदंडों का उपयोग करके ओपनस्कैड कमांड चलाने में सफल रहा:
$ openscad -o output.stl -D "param1="name1"" -D "param2="name2"" openscad-script.scad
संपादित करें: जिस तरह से हमें पास-डी मापदंडों को नोटिस करना है, दोनों सिंगल कोट्स और डबल कोट्स की वजह से होना है Openscad प्रलेखन.
लेकिन जब मैं एक शेल स्क्रिप्ट से एक ही कमांड उत्पन्न और निष्पादित करता हूं, तो Opencad त्रुटि के साथ विफल हो जाता है:
$ ./myscript.sh value1 value2
त्रुटि: पंक्ति में पार्सर त्रुटि XX: सिंटैक्स त्रुटि "टी पार्स फ़ाइल" "Openscad-script.scad"!
कहा पे XX = फ़ाइल की अंतिम पंक्ति।
यहाँ बैश स्क्रिप्ट है
#!/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
यह इतना आसान लग रहा है कि मैं अभी भी यह पता नहीं लगा सकता कि कमांड चलाने में ओपनस्कैड विफल है।
आपकी सहायता के लिए धन्यवाद,
संपादित करें: मुझे इसे काम करने का एक तरीका मिला, हो सकता है कि यह सबसे अच्छा न हो
#!/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
उत्तर:
जवाब के लिए 2 № 1यदि आपकी इच्छित कमांड लाइन है:
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
जवाब के लिए 3 № 2
लेखन से param1="-D "param1="$1"""
, मुझे लगता है कि आपको उम्मीद थी कि बाद में जब आप $param1
, जब आप चलाते हैं तो एम्बेडेड डबल-कोट्स का पुनर्मूल्यांकन किया जाएगा openscad ... $param1
आदेश। लेकिन नहीं, वह जीता "नहीं हुआ।
जो आप चाहते हैं उसे प्राप्त करने के लिए, एक समाधान जो काम करेगा और साफ होगा वह बैश ऐरे का उपयोग कर रहा है:
#!/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
, क्योंकि यह ग्लोबिंग और शब्द विभाजन को रोकने के लिए अनुशंसित है।