2017-01-24 5 views
-1

Я хочу обновить mysql db из сценария Bash, задав значение переменной из того же скрипта.Обновить значение mysql с помощью переменной Bash

IP=$1 
IP="xmpp:`echo $IP`:5222" 
#IP='10.10.10.122' 
echo $IP 

mysql -ulol -plol -Ae 'update cs.load_b set dest_uri="$IP" where group_id="1" limit 1;' 
mysql -ulol -plol -Ae 'select * from cs.load_b;' 

код выполняется следующим образом:

./dbup.sh 10.10.10.122 

В настоящее время обновление устанавливает значение $IP:

mysql: [Warning] Using a password on the command line interface can be insecure. 
+----+----------+------------+--------------+------------+-------------+ 
| id | g_id  | dest_uri | resources | p_mode  | desc  | 
+----+----------+------------+--------------+------------+-------------+ 
| 2 |  1 | $IP  | xmpp=300  |   0 |    | 
+----+----------+------------+--------------+------------+-------------+ 

Я ожидаю:

mysql: [Warning] Using a password on the command line interface can be insecure. 
+----+----------+------------+--------------+------------+-------------+ 
| id | g_id  | dest_uri | resources | p_mode  | desc  | 
+----+----------+------------+--------------+------------+-------------+ 
| 2 |  1 | xmpp:10.10.10.122:5222|xmpp=300|  0 |    | 
+----+----------+------------+--------------+------------+-------------+ 

Mysql версии 5.7 .17, CentOS 7


Ответ на chepner:

48 # Network Address qualifier 
49 qualify_ip() { 
50  echo ".................................................." 
51  if [[ $1 =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then 
52    OIFS=$IFS 
53    IFS='.' 
54    ip=($1) 
55    IFS=$OIFS 
56    [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ 
57     && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] 
58    echo ".................................................." 
59    echo "$1 is a valid network address" 
60    echo ".................................................." 
61  else 
62    echo ".................................................." 
63    echo "$1 is not a valid network address. Exiting." 
64    echo ".................................................." 
65    exit 1 
66  fi 
67  echo ".................................................." 
68 } 
.. 
365 qualify_ip $IP 

Я только в том числе то, что было необходимо для вопроса.

+0

Что это значение '$ PUBLIC_IP' здесь? – Inian

+0

Что еще более важно, что вы делаете, чтобы проверить значение 'PUBLIC_IP', прежде чем использовать его для построения инструкции SQL? – chepner

ответ

0

Изменение этой линии

mysql -ulol -plol -Ae 'update cs.load_b set dest_uri="$IP" where group_id="1" limit 1;' 

в

mysql -ulol -plol -Ae "update cs.load_b set dest_uri='$IP' where group_id=1 limit 1;" 

Так что переменная IP получает расширена за счет оболочки. Мы также пользуемся тем фактом, что MySQL отличает '' и "" для строковых литералов. Кроме того, столбцы group_id представляют собой число. В этом случае нам не нужно вставлять 1 в одинарные кавычки.

Наконец, вы можете использовать $() (подстановку команд) вместо обратных кавычек при задании значения для IP:

IP="xmpp:$(echo $PUBLIC_IP):5222" 

Вы можете даже устранить $() поскольку оно простое расширение переменного:

IP="xmpp:$PUBLIC_IP:5222" 
+1

Также вы можете добавить пункт, чтобы избежать использования '' '' внутренней настройки переменной 'IP' и рекомендовать использовать подстановку команд? – Inian

+1

@Alex: Поскольку вы новичок здесь, пожалуйста, прочитайте [Что делать, если кто-то отвечает на мой вопрос] (http://stackoverflow.com/help/someone-answers) – Inian

+0

Это работает! Я попробовал несколько синтаксисов, рад, что он работает. Спасибо @codeforester. Также - спасибо @nian. Теперь у меня есть: 'IP = $ 1'' mysql -ulol -plol -Ae 'update cs.load_b set dest_uri =' xmpp: $ IP: 5060 'где group_id = 1 limit 1; "' – Alex