Условие "$file = $prog"
является одной строкой. Вы должны попробовать "$file" = "$prog"
вместо.
Следующая расшифровка показывает исправление:
pax> ls -1 qq*
qq
qq.c
qq.cpp
pax> export xx=qq.cpp
pax> for file in qq* ; do
if [[ "${file} = ${xx}" ]] ; then
echo .....${file} equal
else
echo .....${file} not equal
fi
done
.....qq equal
.....qq.c equal
.....qq.cpp equal
pax> for file in qq* ; do
if [[ "${file}" = "${xx}" ]] ; then
echo .....${file} equal
else
echo .....${file} not equal
fi
done
.....qq not equal
.....qq.c not equal
.....qq.cpp equal
В последнем бите вывода видно, что только qq.cpp
отображается как равный, поскольку он соответствует только ${xx}
.
Причина, по которой вы становитесь правдой, заключается в том, что вот что даст вам непустые строки:
pax> if [[ "" ]] ; then
echo .....equal
fi
pax> if [[ "x" ]] ; then
echo .....equal
fi
.....equal
Это потому, что эта форма является проверкой длины строки. Из справочной страницы bash
под CONDITIONAL EXPRESSIONS
:
string
-n string
True if the length of string is non-zero.
Обновление:
Новый код в вашем вопросе не будет работать должным образом. Вам нужно:
if [[ "$(basename ${file})" = "${prog}" ]]; then
на самом деле выполнить basename
и использовать его вывод в качестве первой части проверки на равенство.