由于您已经在创建文件 1,您可以修改创建它的格式,以方便您自己。把你需要的变量写成如下格式:
userID="Name Surname"
pwd=Passwd
study_id=test
isid=testid
然后,您可以使用点命令(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} 的参数列表。