对于这个问题,我可能没有完美的标题,但我想知道是否有办法做到以下几点:
基本上,我有一个带有一些键值对的文本文件,还有一个语句(在同一个文本文件中),它将由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?
很抱歉让它令人困惑。
答案 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
我会注意包含特殊字符(如空格等)的名称和值。如果您打算使用这些字符,请运行彻底的测试!