Поскольку вы уже создаете файл 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}
.
.