Простой Сценарий оболочки с Арифметической проблемой … ** дает мне проблему

Вы забыли начальную наклонную черту прежде bin/python. Это означает /usr/bin/prj-python теперь точки к /usr/bin/bin/python. Что хотели бы Вы это указывать на точно?

6
24.02.2011, 06:17
3 ответа

Стандартная арифметика оболочки только позволяет целочисленные арифметические операции. Это не включает ** для возведения в степень, которое удар имеет как расширение.

Целочисленное возведение в степень достаточно легко реализовать как функция оболочки (хотя Вы скоро столкнетесь с циклическим возвратом).

pow () {
    set $1 $2 1
    while [ $2 -gt 0 ]; do
      set $1 $(($2-1)) $(($1*$3))
    done
    echo $3
}

Как в стороне, почему использование expr здесь? Арифметика Shell может сделать дополнение.

6
27.01.2020, 20:25
  • 1
    Ничего себе, огромное спасибо. Другой быстрый вопрос, если Вы не возражаете... при записи сценария оболочки удара, что является версией удара \c..., когда я поместил это в него эхо он verbatum вместо следующего эха, находящегося на той же строке. –  whuff739 24.02.2011, 00:09
  • 2
    @whuff739: echo -n. Если Вы хотите быть портативными, использовать printf %s 'print\this!exactly+with%no$newline*at;the&end'. –  Gilles 'SO- stop being evil' 24.02.2011, 00:14
  • 3
    Необходимо также проверить bc программа, если Вы хотите наполнить кроме основного, добавляет/умножает/вычитает/делит. Пример: echo $(echo '2^3' | bc) (использование ksh здесь), –  Nitrodist 24.02.2011, 00:16
  • 4
    @Nitrodist, я определенно изучу это, большое спасибо. –  whuff739 24.02.2011, 00:18

Я думаю, что Вам не повезло, как ** оператор экспоненты не является стандартным для/bin/sh. Можно использовать bc, хотя: echo "$y ^ $x" | bc.

2
27.01.2020, 20:25

Оболочка POSIX, по-видимому, не имеет оператора возведения в степень. Можно прокрутить собственное:

pow() {
    local x y res i
    x=$1
    y=$2
    res=1
    i=1
    while [ $i -le $y ]; do
        res=$(( res * x ))
        i=$(( i + 1 ))
    done
    echo $res
}

x=1
while [ $x -le 10 ]; do
    y=1
    while [ $y -le 10 ]; do
        echo "$(pow $y $x)   \c"
        y=$(( y + 1 ))
    done
    echo
    x=$(( x + 1 ))
done
1
27.01.2020, 20:25

Теги

Похожие вопросы