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
答案 0 :(得分:1)
问题是$i
在您定义statement1
和statement2
时会展开,而不是在展开时展开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@
),然后在打印邮件时,将其替换为变量内容。