在多个变量中设置文件的内容

时间:2011-02-25 19:24:39

标签: unix

我是编写Unix脚本的新手。我需要将文件1的内容设置为变量。需要将文件1中创建的变量粘贴/复制到特定行号的文件2中。

文件1(输入)内容:内容我使用grep / awk从另一个文本文件中提取所需的单词。我需要帮助将提取的内容转换为将在$ {CMD}的第二个文件中使用的单独变量。如果可能的话

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

(注意:输入文件中的内容不是常量 - 我可以随时使用2到5个变量。 文件2(输出):文件2是用于生成Post安装文件以创建Product包的模板。我需要将新创建的变量合并/粘贴到$ {CMD}行。

CMD="$FIX_HOME/shell.ksh"

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

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

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

1 个答案:

答案 0 :(得分:0)

由于您已经在创建文件1,因此您可以修改创建文件的格式,以便自己更轻松。以下列格式编写所需的变量:

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

然后,您可以使用dot命令(Bourne Shell,Korn Shell,Bash)或源代码(C Shell,Bash再次)将这些内容读入您的脚本。请注意在包含空格的值周围使用引号。您可以使用单引号,但处理“Martin O'Rourke”更难。如果您不相信数据源,那么在安全之前需要做很多清理工作。

然后,您需要指定变量如何传递到该行的${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}的参数列表。