UNIX:脚本中变量的替换值

时间:2013-09-17 11:50:11

标签: unix key substitution

对于这个问题,我可能没有完美的标题,但我想知道是否有办法做到以下几点:

基本上,我有一个带有一些键值对的文本文件,还有一个语句(在同一个文本文件中),它将由shell脚本提取,并且还需要同时替换STATEMENT中的A,B,C变量。

为简单起见,让我举一个例子。

这是我的文本文件:

文件:values.txt

A=1
B=2
C=3
STATEMENT=apple A orange B grape C

另外,我有一个shell脚本,它从文本文件中提取这些值和语句,并使用STATEMENT变量作为它调用的另一个脚本的参数,如:

脚本:first_script.sh

A=`cat values.txt | grep -w '^A' | cut -d'=' -f2`
B=`cat values.txt | grep -w '^B' | cut -d'=' -f2`
C=`cat values.txt | grep -w '^C' | cut -d'=' -f2`
STATEMENT=`cat values.txt | grep -w 'STATEMENT' | cut -d'=' -f2`

second_script.sh $STATEMENT

正如您所看到的,second_script是在first_script中调用的,并且它使用了STATEMENT变量,所以我期望看到与second_script调用是:

second_script.sh apple 1 orange 2 grape 3

请注意,“A”,“B”和“C”应替换为其值1,2和3。

然而,我得到的仍然是:

second_script.sh apple A orange B grape C

这是我不想要的。

当从first_script调用second_script时,如何确保A,B和C分别替换为1,2和3?

很抱歉让它令人困惑。

2 个答案:

答案 0 :(得分:0)

您可以使用以下字符串替换值:

STATEMENT=${STATEMENT/A/$A} # replace the letter A with the value of $A
STATEMENT=${STATEMENT/B/$B}
STATEMENT=${STATEMENT/C/$C}
second_script.sh "$STATEMENT"

如果您想匹配字边界,请使用sed

STATEMENT=$(sed -e "s/\bA\b/$A/g" -e "s/\bB\b/$B/g" -e "s/\bC\b/$C/g" <<< "$STATEMENT")

此外,您不需要在脚本中使用cat。你可以这样做:

A=`grep -w '^A' values.txt | cut -d'=' -f2`

或者,使用awk

A=$(awk -F= '/^A\y/{print $2}' values.txt)

<强>可替换地:

您是否可以更改values.txt文件?

如果您可以将其更改为:

,会更容易
A=1
B=2
C=3
STATEMENT="apple $A orange $B grape $C"

然后在你的脚本中你可以简单地导入这样的文件:

. values.txt
second_script.sh "$STATEMENT"

答案 1 :(得分:0)

这个怎么样:

#!/bin/bash

tail -1 values.txt | {
  IFS='=' read name statement
  ./second_script.sh $(echo "$statement" | sed -r $(
    head --lines=-1 values.txt | while IFS='=' read name value
    do
      printf "%s s/\<%q\>/%q/g " "-e" "$name" "$value"
    done))
}

我不喜欢硬编码解决方案,因此这将读取values.txt文件并评估语句中的所有变量(除最后一行之外的所有变量)并将其提供给second_script.sh

我会注意包含特殊字符(如空格等)的名称和值。如果您打算使用这些字符,请运行彻底的测试!