3 votos

Mac OS X - Bash scriptsi declaración basada en el estado del sistema

Creando un bash script y usando la sentencia if, ¿cómo ejecuto un comando basado en un estado del sistema?

si un estado específico del sistema está habilitado hacer algo, si no hacer algo diferente?

Te doy un ejemplo real. Digamos, por ejemplo, que quiero ejecutar algunos comandos basados en el estado de Mac OS X Gatekeeper del sistema.

Ejemplo: la siguiente línea de comando en su Mac OS X spctl --status le dará 2 posibles salidas: assessments disabled o assessments enabled .

¿Puedo hacer algo así a continuación? ¿O hay una forma más limpia y eficiente de hacerlo? Gracias

#!/usr/bin/env bash

gatekeeper_status=$(spctl --status)

if [[ ${gatekeeper_status} ==  "assessments enabled" ]]
then
    echo "Gatekeeper is enabled do some stuff"
else
    echo "Gatekeeper is disabled do some stuff"
fi

4voto

Michael Zhou Puntos 167

Su ejemplo es claro, conciso y mantenible, pero carece de comprobación de errores. Este ejemplo utiliza una sentencia case para analizar el estado y saldrá si no hay ninguna cadena en la variable ->

status=$(spctl --status)

case $status in
        'assessments enabled') echo "Gatekeeper is enabled."
        #do more stuff
        #and more stuff
        ;;

        'assessments disabled') echo "Gatekeeper is disabled."
        #do more stuff
        #and more stuff
        ;;

        *) echo "An error has occurred- Exiting script"
        exit
        ;;
esac

También podría escribirse así ->

if   [[ $status == "assessments enabled" ]]
then 
     echo "Gatekeeper is enabled."
     #do more stuff
elif [[  $status == "assessments disabled" ]]
then 
     echo "Gatekeeper is disabled"
     #do more stuff
else
     echo "An error has occurred- Exiting script"
     exit
fi

3voto

user3439894 Puntos 5883

Esta es una de las razones por las que podría código en función de los demás comandos que haya que ejecutar:

#!/bin/bash

if [[ $(spctl --status) == "assessments enabled" ]]; then
    echo "Gatekeeper is enabled."
    # Place additional commands after this comment.

else 
    echo "Gatekeeper is disabled."
    # Place additional commands after this comment.

fi

0 votos

Bien, ya me ha ahorrado una línea de código. Voy a votar arriba y esperar algunas otras respuestas sólo para estar seguro de que se puede hacer de otra manera y si no votaré la tuya. Gracias user3439894

2voto

Usted podría utilice

[[ $(spctl --status) == "assessments enabled" ]] \
    && (echo "Gatekeeper is enabled."; do-additional-stuff) \
    || (echo "Gatekeeper is disabled."; do-other-stuff)

que es técnicamente una línea única. Pero es difícil de leer si no estás acostumbrado a este tipo de cosas; y se vuelve aún más difícil en cuanto hay un montón de comandos adicionales. Dependiendo de tu estilo de codificación, etc., algo como

gk_is_enabled() {
    echo "Gatekeeper is enabled."
    # do lots of additional stuff
}

gk_is_disabled() {
    echo "Gatekeeper is disabled."
    # do lots of other stuff
}

[[ $(spctl --status) == "assessments enabled" ]] && gk_is_enabled || gk_is_disabled

podría funcionar entonces.

Además, puede acortar el [[ $(spctl --status) == "assessments enabled" ]] parte (en cualquier solución) a [[ $(spctl --status) == *enabled ]] .


Además, si quieres volverte realmente loco mostrando algunas habilidades de golpeo podrías hacer

assessments_enabled() {
    echo "Gatekeeper is enabled."
    # do lots of additional stuff
}

assessments_disabled() {
    echo "Gatekeeper is disabled."
    # do lots of other stuff
}

eval $(spctl --status | sed 's/ /_/')

AppleAyuda.com

AppleAyuda es una comunidad de usuarios de los productos de Apple en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros usuarios, hacer tus propias preguntas o resolver las de los demás.

Powered by:

X