【问题标题】:Set the contents of a file in multiple variables在多个变量中设置文件的内容
【发布时间】:2011-02-25 19:24:39
【问题描述】:

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

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

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

(注意:输入文件中的内容不是恒定的——我随时可能有 2 到 5 个变量。 文件 2(输出):文件 2 是一个模板,用于生成安装后文件以创建产品包。我需要将新创建的变量合并/粘贴到 ${CMD} 行。

CMD="$FIX_HOME/shell.ksh"

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

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

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

【问题讨论】:

    标签: unix


    【解决方案1】:

    由于您已经在创建文件 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} 的参数列表。

    【讨论】:

    • 非常感谢乔纳森 - 我已经按照您在步骤 1 中的建议做了。我正在使用 Korn shell,不确定我使用的版本是否会处理关联数组或索引数组。我正在考虑使用数组,但我缺乏信心。感谢您提供的样品。
    • 我正在使用 ksh shell:我需要生成不同的索引,因为元素的顺序在 CMD 行中很重要。我创建了以下
    • 我正在使用 ksh shell:我需要生成不同的索引,因为元素的顺序在 CMD 行中很重要。我在 $(cat myfile) 中创建了以下 $> 对于 wordlist,执行 >wordlist[$I]=$word >I=$((I +1 )) >Done 问题:我是否必须添加 Set -A 命令让所有变量都放在同一个地方?
    • @Ayla:declare -A 是一个 bash 扩展,它执行关联数组。您只需要一个常规的整数索引数组,并且最多需要定义该数组。我发现这个StackOverflow 问题表明set -A variable value1 value2 value3 是正确的做事方式。祝你好运。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-08
    • 2019-01-09
    • 2020-06-17
    • 1970-01-01
    相关资源
    最近更新 更多