سؤال

ولدي مشكلة مع برنامج نصي باش. لا بد لي من استخدام عامل التشغيل * ل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 كمشغل الضرب بدلا من ذلك.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top