Попробуйте это, используя xmlint с выражением xpath :
#!/bin/sh
for xml in *.xml; do
bool=$(xmllint --xpath 'count(//*)=1 and string-length(//*[1])=1' "$xml")
if [ $bool = true ]; then
echo "$xml" >> xml_list_files
fi
done
cat xml_list_files
Выражение проверяет, что файл имеет только один узел без какого-либо текстового содержимого. В этом случае команда возвращаетtrue
Я думаю, это должно сработать:
CFLAGS="-fPIC -O3"./configure --enable-static --disable-shared --prefix="$PREFIX"
Второй вариант:
CFLAGS="-fPIC -O3"
COMMON_CONFIGURE_OPTIONS="--enable-static --disable-shared --prefix=$PREFIX"
CFLAGS="$CFLAGS"./configure $COMMON_CONFIGURE_OPTIONS
CFLAGS="-fPIC -O3"
COMMON_CONFIGURE_OPTIONS="CFLAGS=\"$CFLAGS\" --enable-static --disable-shared --prefix=$PREFIX"
...
"$FOO/configure" $COMMON_CONFIGURE_OPTIONS
Это совершенно неправильно, во-первых, потому что оболочка НЕ продолжает рекурсивно расширять содержимое (, как это делает make
со своими макросами, за исключением того, что make
никогда не "раскавычивает" их):
a=A; b="B=\"$a\""; printf '<%s>\n' "$b"
<B="A">
и во-вторых, потому что переменные без кавычек будут разделены символами изIFS
(пробелов по умолчанию ), что не заботится о кавычках:
a="x \"y z\""; printf '<%s>\n' $a
<x>
<"y>
<z">
Можно, конечно, использовать
eval "$FOO/configure" "COMMON_CONFIGURE_OPTIONS"
(обратите внимание на двойные кавычки вокруг обеих переменных ), но это откроет еще одну банку червей, и вы НЕ ДОЛЖНЫ использовать такие уловки, если вы не очень хорошо владеете всем механизмом синтаксического анализа и расширения и все его причуды, которые, без обид, вам не кажутся.
Решение состоит в том, чтобы забыть о $COMMON_CONFIGURE_OPTIONS
ерунде и передать все эти опции отдельно:
./configure --enable-static --disable-shared --prefix="$PREFIX" CFLAGS="-fPIC -O3"