Ваш вопрос действительно широкий, но есть несколько способов поместить данные в доступное для получения место:
У вас есть другой хост со статическим IP? scp
ваш IP в текстовый файл, хранящийся там в cron
задании. Вы даже можете поместить его в место, обслуживаемое Apache. Если вы не хотите, чтобы ваш IP был известен, вы можете поместить этот файл за фильтр Basic HTTP Auth, чтобы не допустить немытых масс.
Используйте службу типа NoIP или dyndns.org, и настройте соответствующую службу на вашем хосте, чтобы поддерживать запись имени в актуальном состоянии.
Используйте инструмент командной строки для отправки SMS с IP на ваш телефон.
Установите Dropbox или Bt-Sync, закиньте туда свой IP; читайте этот файл с других хостов, настроенных на синхронизированный каталог.
Это кошка с многими многими шкурами.
Скрипт:
#!/bin/sh
IFS=" " # join arguments with a space character
echo "$* = $(( $* ))"
С +
это просто:
./calc.sh 10 + 2
10 + 2 = 12
Но звездочка должна быть экранирована
./calc.sh 10 \* 2
10 * 2 = 20
или
./calc.sh 10 "*" 2
10 * 2 = 20
Ни один из +
, -
, x
или /
не является специальным для оболочки или команды [
]. Ваша проблема в том, что:
-eq
предназначен для числового сравнения. Используйте =
вместо сравнения строк==
не является стандартным sh
[
операторомИтак:
if [ "$2" = + ]; then
res=`expr "$1" + "$2"`
fi
Или используйте конструкцию case
:
case $2 in
+ | - | /) res=`expr "$1" "$2" "$3"`;;
x) res=`expr "$1" "*" "$3"`;;
*) echo >&2 invalid; exit 1;;
esac
Обратите внимание, что вы бы использовали expr
только если бы имели дело с древними системами. Современные стандартные реализации sh
имеют встроенные арифметические расширения через оператор $((...))
и лучшую форму подстановки команд с $(...)
вместо `...`
.
Если вы используете оболочку bash
, вы можете попробовать:
if [ $2 == "+" ] ;then
res=$(($1 + $3))
echo $res
fi
Изменить
Измените следующую строку (обратите внимание на замена '
на "
):
else res=`Operación no válida` ;
To:
else res="Operación no válida" ;
Edit 2
Вместо того, чтобы использовать так много операторов if else
, вы можете использовать оператор case:
case $2 in
+)
res=`expr $1 + $3`
;;
-)
res=`expr $1 - $3`
;;
/)
res=`expr $1 \/ $3`
;;
x)
res=`expr $1 \* $3`
;;
*)
res="Operación inválida"
;;
esac
echo "$res"
Как уже отмечал @AlexP, вы выполняете арифметические операции вместо сравнения строк.
Я также настоятельно рекомендую вам использовать двойные скобки [[]]
вместо одиночных.
Ваш код может быть записан как:
#!/bin/bash
if [[ $2 == "+" ]]; then
echo $(($1+$3))
elif [[ $2 == "/" ]]; then
echo $(($1/$3))
fi
Примеры выполнения:
./math.sh 2 + 7
9
./math.sh 7 / 2
3