2017-02-13 21 views
0

Почему, если я даю эти командные строки:IP-адрес принимается в качестве переменной в Баш

ip rule add from 10.222.192.0/25 table pdl 
    ip route add 10.104.44.0/24 via 10.222.193.17 table pdl 

все работает, в то время как, если я выполнить этот скрипт:

#!/bin/sh 

IPRULEADD=$(/sbin/ip rule add) 
IPROUTEADD=$(/sbin/ip route add) 

# 
# 

#----------- pdl --------------------------- 
echo 100 pdl >> /etc/iproute2/rt_tables 

$IPRULEADD from 10.222.192.0/25 table pdl 
$IPROUTEADD 10.104.44.0/24 via 10.222.193.17 table pdl 

Я получаю эту ошибку:

from: can't read /var/mail/10.222.192.0/25

?

Благодаря

+0

попробуйте добавить 'echo '$ IPRULEADD" 'и т. Д. После того, как вы установили эти переменные. Удачи. – shellter

ответ

0

$(...) не хранит код для последующего использования; он производит результат прилагаемого кода.

Вам нужны функции оболочки.

ip_rule_add() { 
    /sbin/ip rule add "[email protected]" 
} 

ip_route_add() { 
    /sbin/ip route add "[email protected]" 
} 

ip_rule_add from 10.222.192.0/25 table pdl 
ip_route_add 10.104.44.0/24 via 10.222.193.17 table pdl 

Независимо аргументы вы передаете функции правильно добавлены в список аргументов /sbin/ip с "[email protected]" нотации.

+0

Спасибо! Первый ответ был самым легким, и я был тем, кем намеревался. Ваш был самым техническим и интересным. Можете ли вы объяснить мне, почему я не должен использовать форму IPRULEADD = "/ sbin/ip rule add"? – Step

+0

Когда вы расширяете 'IPRULEADD', значение подлежит первому расщеплению слов, а затем расширению имени пути. В вашем текущем случае это не имеет значения. Но рассмотрите что-то вроде 'FOO =" echo '9 3' * ''. Если вы разворачиваете' $ FOO', вы сначала применяете разбиение слов, чтобы получить 4 разных слова ('echo',' '9',' 3'' , и '*'), поэтому 'echo' уже имеет еще один аргумент, чем вы ожидали. Затем расширение пути расширило бы' * 'до списка всех файлов в текущем каталоге. (Если файлов нет,' * 'либо обрабатывается буквально, либо исчезает, в зависимости от вариантов оболочки в действии.) – chepner

+0

Я немного новичок в bash, так что это не совсем понятно, но спасибо – Step

0

Не используйте подоболочки для хранения строк в переменных.

IPRULEADD="/sbin/ip rule add" 
IPROUTEADD="/sbin/ip route add" 
+0

Параметры являются неправильной абстракцией для хранения кода. В общем случае расщепление слов и расширение пути будут вызывать нечто иное, чем предполагаемые команды и аргументы. – chepner