Verschachtelte Indexausdrücke $a{2+$b{$c}} dürften gelingen, aber nur in 2 Durchläufen.
Jau. Genau das ist mir bei weiteren Tests aufgefallen… Sogar die Idee mit dem zweiten Durchlauf kam auch mir.
Das folgende behebt dieses Problem und führt mit den Resultaten einen Syntax-Test durch, bevor diese übernommen werden. Ein Backup wird dennoch erzeugt.
(Soweit zum "Ein- bis Drei-Zeiler" …)
#!/bin/bash
### php73to74.sh
### Diese Zeile muss angepasst werden!
phpcli='/usr/bin/php74/bin/php-cli';
###
file=$1;
if [ -z "${file}" ]; then
echo "Keine Datei angegeben. Exit!" 2>&1;
exit 1;
elif [ -f "${file}]" ]; then
echo "'${file}' ist keine Datei. Exit!" 2>&1;
exit 2;
elif [ ! -r "${file}" ]; then
echo "'${file}' ist nicht lesbar. Exit!" 2>&1;
exit 4;
elif [ ! -w "${file}" ]; then
echo "Keine Schreibrechte an '${file}' Exit!" 2>&1;
exit 8;
fi
if [ ! -f "${phpcli}" ] && [ ! -x "${phpcli}" ]; then
echo "phpcli ('${phpcli}') ist falsch. Exit!" 2>&1;
exit 8;
fi
tmpfile1=`mktemp`;
tmpfile2=`mktemp`;
backupfile="${file}-`date +%Y%m%d_%H%M`";
sed -E -e 's/\$([a-zA-Z0-9_]+)\{([^\}]*)\}/\$\1[\2]/g' "${file}" > "${tmpfile1}";
$phpcli -l "${tmpfile1}" 1>/dev/null 2>/dev/null;
if [ 0 -eq $? ]; then
cp "${file}" "${backupfile}";
cp "${tmpfile1}" "${file}";
echo "Erfolg: '${file}' umgewandelt. Backup in '${backupfile}'." 2>&1;
rm -f "${tmpfile1}" "${tmpfile2}";
exit 0;
else
sed -E -e 's/\$([a-zA-Z0-9_]+)\{([^\}]*)\}/\$\1[\2]/g' "${tmpfile1}" > "${tmpfile2}";
$phpcli -l "${tmpfile2}" 1>/dev/null 2>/dev/null;
if [ 0 -eq $? ]; then
cp "${file}" "${backupfile}";
cp "${tmpfile2}" "${file}";
echo "Erfolg: '${file}' umgewandelt. Backup in '${backupfile}'." 2>&1;
rm -f "${tmpfile1}" "${tmpfile2}";
exit 0;
fi
fi
echo "Misserfolg: '${file}' konnte nicht erfolgreich umgewandelt werden.";
echo "Grund:";
err=`$phpcli -l "${file}" 1>/dev/null 2>&1`;
if [ 0 -ne $? ]; then
echo "'${file}' enthält folgenden Fehler:";
echo $err;
rm -f "${tmpfile1}" "${tmpfile2}";
exit 16;
fi
err=`$phpcli -l "${tmpfile1}" 2>&1`;
if [ 0 -ne $? ]; then
echo "Erster Umwandlungsversuch führte zu folgendem Fehler:";
echo $err;
fi
err=`$phpcli -l "${tmpfile2}" 2>&1`;
if [ 0 -ne $? ]; then
echo "'Zweiter Umwandlungsversuch führte zu folgenden Fehler:";
echo $err;
fi
rm -f "${tmpfile1}" "${tmpfile2}";
exit 16;
Zu exekutieren mit:
find -name *.php -print0 | xargs -0 /PFAD/ZU/php73to74.sh > php73to74.log
Es verbleiben:
Indexzugriffe auf Funktionsergebnisse werden wohl auch ignoriert, aber so was ist selten und kann von Hand passieren.
und:
Whitespace zwischen Variable und { führt ebenso zur Nichterkennung, das ist aber je nach deinem Coding Style irrelevant.
Von beiden lass ich (vorerst) die Finger, weil ich befürchte, da mehr einzureißen als zu reparieren. Ich hab ja das Logfile...