تجنب توسيع * في باش مدمج وظيفة اسمحوا
سؤال
ولدي مشكلة مع برنامج نصي باش. لا بد لي من استخدام عامل التشغيل * لmultiplicate. بدلا من ذلك الخلل النصي لي مع التوسع واستخدام كمشغل اسم النص نفسه. حاولت مع علامات الاقتباس المفردة ولكنه لا يعمل :( هنا رمز
#!/bin/bash -x
# Bash script that calculates an arithmetic expression
# NO PRECEDENCE FOR OPERATORS
# Operators: + - *
if [ "$#" -lt "3" ]
then
echo "Usage: ./calcola.scr <num> <op> <num> ..."
exit 1
fi
result=0
op=+
j=0
for i in "$@"
do
if [ "$j" -eq "0" ]
then
# first try
#result=$(( $result $op $i ))
# second try
let "result$op=$i"
j=1
else
op=$i
j=0
fi
done
echo "Result is $result"
exit 0
المحلول
إذا "المرجع" هو "*"، سيتم توسيعه من قبل قذيفة قبل السيناريو الخاص بك حتى يراها. عليك أن تختار شيئا آخر لمشغل الضرب الخاص بك، مثل "س"، أو إجبار المستخدمين على الخروج منه من خلال وضعه في علامات الاقتباس المفردة أو الفائتة ذلك بخط مائل.
إذا شروط ممارسة تسمح بذلك، ربما عليك أن تحاول استخدام "قراءة" للحصول على التعبير من الإدخال القياسي بدلا من الحصول عليها من سطر الأوامر.
نصائح أخرى
إذا كنت لا تحتاج "* التوسع" (يشار إليه بأنه "globbing" بشكل عام) في كل لالسيناريو الخاص بك، مجرد بداية مع "-f". يمكنك أيضا تغييره أثناء وقت التشغيل:
mat@owiowi:/tmp/test$ echo *
A B
mat@owiowi:/tmp/test$ set -f
mat@owiowi:/tmp/test$ echo *
*
mat@owiowi:/tmp/test$ set +f
mat@owiowi:/tmp/test$ echo *
A B
وكان يعمل، كنت فقط لا مفر من *
بشكل صحيح. حاول استخدام مائل:
$ ./calcola.scr 2 \* 3
+ '[' 3 -lt 3 ']'
+ result=0
+ op=+
+ j=0
+ for i in '"$@"'
+ '[' 0 -eq 0 ']'
+ let result+=2
+ j=1
+ for i in '"$@"'
+ '[' 1 -eq 0 ']'
+ op='*'
+ j=0
+ for i in '"$@"'
+ '[' 0 -eq 0 ']'
+ let 'result*=3'
+ j=1
+ echo 'Result is 6'
Result is 6
+ exit 0
$
وعلى الرغم، كما بول Tomblin المذكورة ، ربما يكون من الأفضل استخدام x
كمشغل الضرب بدلا من ذلك.