bash参数通过echo在标量变量中扩展

时间:2014-10-14 22:53:39

标签: bash echo variable-expansion brace-expansion

title:标量变量中的bash参数扩展

我有一个bash脚本,它在两个文件之间运行diff。 如果有差异,我希望它打印statement1和statement2 它们很长,所以我将它们放入变量,但是回声声明 不会扩展参数。 这可以用bash完成吗?

#!/bin/bash
set -x

source="/home/casper"
target="data/scripts"
statement1="There is a change in ${i}, please check the file"
statement2="or cp /home/casper/${i} /data/scripts/$i"

for i in file1 file2l file3 file4 file5  ; do
    sleep 1 ;
    if diff $source/$i $target/$i 2>&1 > /dev/null ; then
        echo " "
    else
        echo "$statement1 "
        echo "$statement2 "
    fi
done
exit 0

该脚本似乎有效 - 它需要找到一个差异。 然而,这就是打印出来的。

There is a change in , please check the file
or cp /home/casper/ data/scripts/

我想要它说

There is a change in file2, please check the file
or cp /home/casper/file2 /data/scripts/file2

2 个答案:

答案 0 :(得分:1)

问题是$i在您定义statement1statement2时会展开,而不是在展开时展开notification () { echo "There is a change in $1, please check the file" echo "or cp /home/casper/$1 /data/scripts/$1" } source="/home/casper" target="data/scripts" for i in file1 file2l file3 file4 file5 ; do sleep 1 ; if diff "$source/$i" "$target/$i" 2>&1 > /dev/null ; then echo " " else notification "$i" fi done exit 0 。使用shell函数输出文本。

{{1}}

答案 1 :(得分:0)

可以使用eval

来完成
TEMPLATE_MSG="aaa \${VALUE} ccc"
...
VALUE="bbb"
eval echo "${TEMPLATE_MSG}"

但我不推荐它,因为eval是邪恶的:-)其他选项是使用模式替换:

TEMPLATE_MSG="aaa @1@ ccc"
...
VALUE="bbb"
echo "${TEMPLATE_MSG/@1@/${VALUE}}"

因此,您在邮件中添加了一些独特的模式(例如@1@),然后在打印邮件时,将其替换为变量内容。