Как я могу включить *
внутри строки?
Вот мой код:
#!/bin/bash
# This is a simple calculator using select statement
echo -n 'Insert 1st operand: '
read first
echo -n 'Insert 2nd operand: '
read second
echo 'Select an operator:'
operators="+ - * /"
select op in $operators
do let "result=${first}${op}${second}"
break
done
echo -e "Result = $result"
Когда я запускаю этот код, *
отобразит все файлы в текущем каталоге как select
выбор. Я пытался сбежать с \*
но это не работает.
Расширяет свои параметры. Но потом select
тоже расширяет свои параметры. Оболочка расширяется \*
чтобы просто *
, что не помогает, так как select
затем расширяет это *
. Вам нужно что-то, что расширяется до \*
, что было бы \\*
.
В качестве альтернативы просто используйте:
select op in + - \* /;
или:
select op in "$operators"
Сначала вы можете поместить оператор $ в двойные кавычки, чтобы убедиться, что нет интерпретации. Правильно выберите отображение списка параметров. Кстати, конец кода работает не так, как ожидалось: он отображает первый и второй операнды, но не оператор
Массивы довольно часто помогают при написании сценариев оболочки, когда вы испытываете трудности с использованием строки, которую вы создали динамически.
$ operators=( + - '*' / )
$ PS3="choice? "
$ select o in "${operators[@]}"; do echo "$o $REPLY"; done
1) +
2) -
3) *
4) /
choice? 1
+ 1
choice? 2
- 2
choice? 3
* 3
choice? 4
/ 4