我有一个关于如何在循环内使用另一个变量名调用变量的问题。
以下脚本不起作用:
#!/bin/bash
# Comparing test1.txt with test2.txt, test1.ini with test2.ini, test1.conf with test2.conf
FIRSTFILE1=test1.txt;
SECONDFILE1=test2.txt;
FIRSTFILE2=test1.ini;
SECONDFILE2=test2.ini;
FIRSTFILE3=test1.conf;
SECONDFILE3=test2.conf;
for NUM in {1..3};
do
diff --brief <(sort $FIRSTFILE$NUM) <(sort $SECONDFILE$NUM) > /dev/null
value=$?
if [ $value -eq 1 ]
then
echo "different"
else
echo "identical"
fi
done
答案1
您正在寻找间接参数扩展。您可以在 bash 中使用感叹号来实现此目的。
#!/bin/bash
FIRSTFILE1=test1.txt;
SECONDFILE1=test2.txt;
FIRSTFILE2=test1.ini;
SECONDFILE2=test2.ini;
FIRSTFILE3=test1.conf;
SECONDFILE3=test2.conf;
for NUM in {1..3};
do
a=FIRSTFILE$NUM
b=SECONDFILE$NUM
echo ${!a}
echo ${!b}
done
您将需要更多测试才能找到 oneliner :)。欲了解更多信息,请参阅:http://www.gnu.org/software/bash/manual/html_node/Shell-Parameter-Expansion.html
答案2
如果严格地将变量合并为一个,则不是对问题的解释,但以下内容将为您提供迭代文件的工作结果:
for EXT in txt ini conf;
do
diff --brief <(sort test1.${EXT}) <(sort test2.${EXT}) > /dev/null
value=$?
if [ $value -eq 1 ]
then
echo "different"
else
echo "identical"
fi
done
答案3
使用数组,因为它们的用途是:
#!/bin/bash
first=( test1.txt test1.ini test1.conf )
second=( test2.txt test2.ini test2.conf )
for (( i = 0; i < ${#first[@]}; ++i )); do
if cmp -s "${first[i]}" "${second[i]}"; then
echo 'same'
else
echo 'different'
fi
done
或者,如果你的文件名都是可预测的,
#!/bin/bash
suffixes=( .txt .ini .conf )
for suffix in "${suffixes[@]}"; do
if cmp -s "test1$suffix" "test2$suffix"; then
echo 'same'
else
echo 'different'
fi
done