0

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

基本上,我有一个带有一些键值对的文本文件和一个语句(在同一个文本文件中),它将由 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?

很抱歉让您感到困惑。

4

2 回答 2

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.

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

于 2013-09-17T12:30:25.757 回答
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"
于 2013-09-17T12:09:33.867 回答