En realidad sólo hay una sintaxis error que te hizo. Poner un espacio antes del Número en $ApplicationVersionNumber
. La mayoría de las aplicaciones no tienen una versión.plist archivo, pero siempre tienen la versión en su Información.plist.
Aquí es una versión fija de la secuencia de comandos con un par de mejoras:
#!/bin/sh
ApplicationName=/Applications/FakeApp.app
ApplicationVersionNumber=1.0
echo $ApplicationName
#Check if Directory Exist
if [ ! -d $ApplicationName ]; then
echo "$ApplicationName is not installed"
exit 123456
fi
echo "$ApplicationName is installed"
# Check Version
VersionCheck=`plutil -p "${ApplicationName}/Contents/Info.plist" | grep "CFBundleShortVersionString.*$ApplicationVersionNumber"`
echo $VersionCheck
if [ ${#VersionCheck} != 0 ]; then
echo "$ApplicationName $ApplicationVersionNumber is Installed"
exit 0
fi
echo "$ApplicationName $ApplicationVersionNumber is NOT Installed"
exit 1
- Se utiliza
plutil -p
en lugar de cat
, ya que plutil puede imprimir un agradable, versión legible de la plist, incluso si no está en formato XML.
- Es greps para la clave (CFBundleShortVersionString),
.*
, y el valor. Esto es mejor porque no quieres que se active en cosas como LSMinimumSystemVersion
.
- También he añadido más citas porque me gustan las citas y las cosas son (en general) menos probable que se rompa de esa manera.
Yo hubiera escrito algo como esto:
#!/bin/bash
app_path="$1"
desired_version="$2"
#Get the line, regardless of whether it is correct
version_line=$(plutil -p "${app_path}/Contents/Info.plist" | grep "CFBundleShortVersionString")
if [[ $? -ne 0 ]]; then
version_line=$(plutil -p "${app_path}/Contents/Info.plist" | grep "CFBundleVersion")
if [[ $? -ne 0 ]]; then #if it failed again, the app is not installed at that path
echo "$app_path not installed at all"
exit 123456
fi
fi
#Some text editing to get the real version number
real_version=$(echo $version_line | grep -o '"[[:digit:].]*"' | sed 's/"//g')
if [ "$real_version" = "$desired_version" ]; then
echo "$app_path $desired_version is installed"
exit 0
fi
echo "${app_path}'s version is $real_version, not $desired_version"
exit 1
La ventaja de esto es que se comprueba la versión actual de la cadena, de modo que si pones 1.3 y 1.3.1, informa de que se trata de una versión diferente. $1
y $2
son los argumentos de línea de comandos que se pasan como ./script.sh '/Applications/FakeApp.app' '1.3'
También, el otro cuenta como correcta en 1.1 por 121 porque grep cuenta el .
como comodín.