Как использовать в качестве аргументов символы + , - , x , / в скрипте [duplicate]

Ваш вопрос действительно широкий, но есть несколько способов поместить данные в доступное для получения место:

У вас есть другой хост со статическим IP? scp ваш IP в текстовый файл, хранящийся там в cron задании. Вы даже можете поместить его в место, обслуживаемое Apache. Если вы не хотите, чтобы ваш IP был известен, вы можете поместить этот файл за фильтр Basic HTTP Auth, чтобы не допустить немытых масс.

Используйте службу типа NoIP или dyndns.org, и настройте соответствующую службу на вашем хосте, чтобы поддерживать запись имени в актуальном состоянии.

Используйте инструмент командной строки для отправки SMS с IP на ваш телефон.

Установите Dropbox или Bt-Sync, закиньте туда свой IP; читайте этот файл с других хостов, настроенных на синхронизированный каталог.

Это кошка с многими многими шкурами.

1
14.11.2016, 15:23
4 ответа

Скрипт:

#!/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
1
27.01.2020, 23:34

Ни один из +, -, 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 имеют встроенные арифметические расширения через оператор $((...)) и лучшую форму подстановки команд с $(...) вместо `...`.

0
27.01.2020, 23:34

Если вы используете оболочку 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"
1
27.01.2020, 23:34

Как уже отмечал @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
0
27.01.2020, 23:34

Теги

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