Как вырезать переменные, которые находятся между кавычками из строки - PullRequest
0 голосов
/ 06 января 2019

У меня была проблема с вырезанными переменными из строки в кавычках. У меня есть несколько сценариев, которые нужно написать для моих классов sys, у меня была проблема со сценарием, в котором мне приходилось читать ввод от пользователя в виде (a = "var1", b = "var2")

Я попробовал код ниже

#!/bin/bash
read input
a=$($input | cut -d '"' -f3)
echo $a

в строке 3 возвращается сообщение об ошибке «команда не найдена». Я пытался заключить в квадратные скобки, например

a=$(($input | cut -d '"' -f3)

но это все равно неправильно.

Ответы [ 2 ]

0 голосов
/ 07 января 2019

В комментарии ОП дала рабочий ответ (должен опубликовать его как ответ):

#!/bin/bash
read input
a=$(echo $input | cut -d '"' -f2)
b=$(echo $input | cut -d '"' -f4)
echo sum: $(( a + b))
echo difference: $(( a - b))

Это будет работать для пользовательского ввода в точности как a="8", b="5".
Никогда не доверяйте вводу. Возможно, вы захотите добавить чек

if [[ ${input} =~ ^[a-z]+=\"[0-9]+\",\ [a-z]+=\"[0-9]+\"$ ]]; then
   echo "Use your code"
else
   echo "Incorrect input"
fi

И когда вы добавляете проверку, вы можете захотеть выполнить ввод (после замены запятой на точку с запятой).

input='testa="8", testb="5"'
if [[ ${input} =~ ^[a-z]+=\"[0-9]+\",\ [a-z]+=\"[0-9]+\"$ ]];
then
   eval $(tr "," ";" <<< ${input})
   set | grep -E "^test[ab]="
else
   echo no
fi

EDIT:
@PesaКомментировал правильно о BASH_REMATCH:
Когда вы используете bash и тест на входе, вы можете использовать

if [[ ${input} =~ ^[a-z]+=\"([0-9]+)\",\ [a-z]+=\"([0-9])+\"$ ]];
then
   a="${BASH_REMATCH[1]}"
   b="${BASH_REMATCH[2]}"
fi
0 голосов
/ 06 января 2019

Чтобы извлечь цифру 1 из строки "var1", вы, скорее всего, использовали бы замену подстроки Bash:

$ s="var1"
$ echo "${s//[^0-9]/}"
1

Или,

$ a="${s//[^0-9]/}"
$ echo "$a"
1

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

$ s2="1 and a 2 and 3"
$ echo "${s2//[^0-9]/}"
123

В этом случае вы бы использовали sed или grep awk или регулярное выражение Bash для захвата отдельных числовых полей и их различения:

$ echo "$s2" | grep -o -E '[[:digit:]]+'
1
2
3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...