как сказанный @manatwork, это выглядит более простым и более безопасным создать новый список с допустимыми узлами.
Однако, поскольку "$nodes" оценен перед первым повторением для цикла, должно быть возможно изменить его во время того же самого цикла:
$ nodes="127.0.0.1 1.2.3.4 1.2.3.4 "
$ for node in $nodes; do
result=$(ping -c 1 $node >/dev/null 2>/dev/null; echo $?);
if [ "$result" -ne 0 ];
then nodes=$(echo $nodes | sed -e "s/ *$node */ /");
fi;
echo result=$result node=$node nodes=$nodes ;
done ;
Уведомление: моя замена sed [space]$node[space]
или $node[space]
или [space]$node
работать во всех случаях в зависимости от положения $node
в $nodes
список (Если в середине, или первое или последний элемент, пространство (пространства) прежде и после того, как это будет или подарок или не). И это только заменяет 1 происшествие за один раз, но Вы могли добавить финал /g
избавиться от всех происшествий сразу.
Это производит:
result=0 node=127.0.0.1 nodes=127.0.0.1 1.2.3.4 1.2.3.4
result=1 node=1.2.3.4 nodes=127.0.0.1 1.2.3.4
result=1 node=1.2.3.4 nodes=127.0.0.1
Учитывая показанный вами файл, вы должны уметь:
(set -f ; IFS='
' ; env - $(cat /path/to/file) /path/to/your/program
)
Если это не работает, то только потому, что сначала нужно отформатировать файл окружения. Вот пример:
(set -f ; IFS='
' ; env - $(cat) printenv
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
Сначала я думал, что вы можете сделать это через оболочку - но она, вероятно, установит некоторое собственное окружение перед вызовом вашей программы. Но я могу, по крайней мере, продемонстрировать, что аргументы назначаются правильно:
(set -f; IFS='
' ; env - $(cat) sh -c 'echo "$variable3"'
) <<\ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
ENV
###OUTPUT###
value3 an$d s'om\e m"ore
Тем не менее, если вы предпочитаете исходные тексты, вот как вы можете использовать оболочку:
(echo '$1'; cat; echo '$2') <<\ENV |\
env - sh -s -- 'set -a' printenv
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
###OUTPUT###
PWD=/home/mikeserv/test
SHLVL=1
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
_=/usr/bin/printenv
Обратите внимание, что я удалил $IFS
- в этом нет необходимости - но я должен был получить уточнения по поводу кавычек в файле. Здесь я по существу .dot
- источник stdin
- читаю |pipe
как входной файл - но вы можете использовать любой файл. Я использую set -a
перед чтением входного файла для установки опции --allexport
.
Это результат использования bash
sh
- он добавляет $PWD
, $SHLVL
и $_
. С тире dash
это немного лучше. И тире
тоже не добавляет кучу экспортированных данных, поэтому вы можете указать параметр -a
в командной строке:
(cat; echo '$1') <<\ENV |\
env - dash -sa -- printenv
variable1=value1
variable2=value2
variable3='value3 an$d s'\''om\e m"ore'
ENV
variable1=value1
variable2=value2
variable3=value3 an$d s'om\e m"ore
PWD=/home/mikeserv/test
Проходит только $PWD
.
Все это можно сделать в Python
:
$ cat config.py
env = {
'FOO' : 'bar',
'X' : '12',
}
$ cat test.py
import os
import config
os.environ.clear()
os.environ.update(config.env)
print os.environ
Затем:
$ python test.py
{'X': '12', 'FOO': 'bar'}
Другим способом будет чтение файла в массив, а затем использование массива в качестве аргумента. Преимущество по сравнению с использованием подстановки процесса заключается в том, что он может обрабатывать значения с пробелами в них. Пример:
$ cat file
FOO=bar
X=12
var=a b c
$ IFS=$'\n' read -d '' -ra vars < file
$ env -i "${vars[@]}" python env.py
{'var': 'a b c', 'X': '12', 'FOO': 'bar'}