Установить содержимое файла в нескольких переменных - PullRequest
0 голосов
/ 25 февраля 2011

Я новичок в написании сценариев Unix. Мне нужно установить содержимое файла 1 для переменных. Переменные, созданные в файле 1, должны быть вставлены / скопированы в файл 2 с определенным номером строки.

Файл 1 (входной) Содержание: Содержание Я использовал grep / awk для извлечения необходимых слов из другого текстового файла. Мне нужна помощь в преобразовании содержимого, извлеченного в отдельные переменные, которые будут использоваться во втором файле в $ {CMD}. если возможно

userid:Name
pwd:Passwd
study_id:test
isid:testid
.......
.......

(Примечание. Содержимое входного файла не является константой - в любой момент я могу иметь от двух до 5 переменных. Файл 2 (Вывод): Файл 2 - это шаблон, который используется для создания файла установки Post для создания пакета продукта. Мне нужно слить / вставить вновь созданную переменную в строку $ {CMD}.

CMD="$FIX_HOME/shell.ksh"

print "================= Start ${CMD}================"

${CMD} <Variables are set at this line>

Print "Exit form ${CMD} <$?>"

1 Ответ

0 голосов
/ 26 февраля 2011

Поскольку вы уже создаете файл 1, вы можете изменить формат, в котором вы его создаете, чтобы упростить его для себя.Запишите необходимые переменные в формате:

userID="Name Surname"
pwd=Passwd
study_id=test
isid=testid

Затем вы можете прочитать их в свой сценарий с помощью команды точки (Bourne Shell, Korn Shell, Bash) или источника (C Shell, Bash снова).Обратите внимание на использование кавычек вокруг значения, содержащего пробелы.Вы можете использовать одинарные кавычки, но тогда работать с «Мартином О'Рурком» сложнее.Если вы не можете доверять источнику данных, необходимо выполнить большую очистку, прежде чем это станет безопасным.

Затем необходимо указать, как переменные передаются в ${CMD} в строке.Другой сложный момент - знать, какие переменные были установлены, потому что вы, вероятно, хотите передать только эти переменные, а не все возможные переменные.И пробелы в аргументах определенно усложняют вещи.

Если у вас Bash 4.x (3.x недостаточно), вы можете использовать ассоциативный массив.

CMD="$FIX_HOME/shell.ksh"
declare -A array
. file1                            # Set variable values
for name in $(sed 's/=.*//' file1) # Get variable names
do
    x=$(eval echo "\$$name")
    array[$name]="-$name=$x"
done

echo "================= Start ${CMD} ================"

${CMD} "${array[@]}"

echo "================= Exit from ${CMD} <$?> ================="

С учетом файла данных:

name="Martin O'Rourke"
id=21131
testid=P/23/41
isis=N23-45112

и при запуске с CMD=al, где al - это программа, которая отображает свои аргументы, по одному на строку, выходные данные из которых были такими, как показано - обратите внимание, что аргументы были не в порядкев котором они были введены:

$ bash-4.1 test.script
================= Start al ================
-name=name
-isis=N23-45112
-id=21131
-testid=P/23/41
================= Exit from al <0> =================
$ 

Если у вас более ранняя версия bash, вам нужно использовать индексированный массив, который может иметь преимущества в том порядке, в котором элементы в командной строке будутбыть решительным.Недостатком является то, что вам нужно генерировать отдельные индексы.

Однако это может сильно усложнить ситуацию.

CMD="$FIX_HOME/shell.ksh"

echo "================= Start ${CMD} ================"

${CMD} $(<file1)

echo "================= Exit from ${CMD} <$?> ================="

Или, если вы хотите, чтобы перед опцией были тире.Имена:

CMD="$FIX_HOME/shell.ksh"

echo "================= Start ${CMD} ================"

${CMD} $(sed 's/^/-/' file1)

echo "================= Exit from ${CMD} <$?> ================="

Существуют и другие способы работы с этим, но это зависит от того, что вы действительно хотите видеть в качестве списка аргументов для ${CMD}.

.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...