Коли я запускаю команди в своїй оболонці, як показано нижче, вона повертає expr: non-integer argument
помилку. Може хтось, будь ласка, пояснить це мені?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Коли я запускаю команди в своїй оболонці, як показано нижче, вона повертає expr: non-integer argument
помилку. Може хтось, будь ласка, пояснить це мені?
$ x=20
$ y=5
$ expr x / y
expr: non-integer argument
Відповіді:
Ці змінні є змінними оболонок. Щоб розширити їх як параметри до іншої програми ( тобто expr
), вам потрібно використовувати $
префікс:
expr $x / $y
Причина, на яку він скаржився, полягає в тому, що він вважав, що ви намагаєтесь працювати з алфавітними символами ( тобто не цілими числами)
Якщо ви використовуєте оболонку Bash, ви можете досягти такого ж результату, використовуючи синтаксис виразів:
echo $((x / y))
Або:
z=$((x / y))
echo $z
man bash
підказку ( q
для виходу)
Я вважаю, що це вже згадувалося в інших темах:
calc(){ awk "BEGIN { print "$*" }"; }
тоді ви можете просто ввести:
calc 7.5/3.2
2.34375
У вашому випадку це буде:
x=20; y=3;
calc $x/$y
або якщо ви хочете, додайте це як окремий сценарій і зробіть його доступним у $ PATH, щоб ви завжди мали його у вашій локальній оболонці:
#!/bin/bash
calc(){ awk "BEGIN { print $* }"; }
echo '1 / 3' | bc -l
Чому б не використовувати let; Мені це набагато легше. Ось приклад, який вам може бути корисним:
start=`date +%s`
# ... do something that takes a while ...
sleep 71
end=`date +%s`
let deltatime=end-start
let hours=deltatime/3600
let minutes=(deltatime/60)%60
let seconds=deltatime%60
printf "Time spent: %d:%02d:%02d\n" $hours $minutes $seconds
Ще один простий приклад - обчислити кількість днів з 1970 року:
let days=$(date +%s)/86400
Оболонка за замовчуванням у більшості дистрибутивів Linux - Bash. У Bash змінні повинні використовувати префікс знака долара для розширення параметра . Наприклад:
x=20
y=5
expr $x / $y
Звичайно, Bash також має арифметичні оператори та спеціальний синтаксис арифметичного розширення , тому немає необхідності викликати бінарний файл expr як окремий процес. Ви можете дозволити оболонці виконувати всю роботу так:
x=20; y=5
echo $((x / y))
expr
це перешкоджає 2013 р.
припустимо
x=50
y=5
тоді
z=$((x/y))
це буде працювати належним чином. Але якщо ви хочете використовувати / оператора в операторах випадків, він не може його вирішити. У цьому випадку використовуйте прості рядки, такі як div або devide або щось інше. Дивіться код
/
прекрасно працює як оболонка корпусу. Те, що не працює, - це використовувати *
для множення, не цитуючи це, що може бути тим, що ви насправді зробили; це призводить до того, що він ефективно перекриває всі наступні пункти у справі, які у вашому прикладі - "розділити" та "модуль"
Щоб отримати цифри після десяткових знаків, ви можете зробити це:
read num1 num2
div=`echo $num1 / $num2 |bc -l`
echo $div