Escrevendo uma GUI simples para um script simples

3

Eu tenho um script bash que faz algumas mudanças no sistema envolvendo uma lista de endereços de URL começando com "http", e estou tentando escrever uma GUI para ele.

Estou preso à seguinte parte:


changes="$(cat /home/$USER/.updates.log | grep http)"
if [ "$changes" != 0 ]; then
    zenity --question --text "Changes found in:\n$changes\n\nWould you like to update now?"
        if [ $? = 0 ]
        then
# password
sudo_password="$(gksudo --print-pass --description 'MyScript' -- : 2>/dev/null)"
# check for null entry or cancellation
if [[ ${?} != 0 || -z ${sudo_password} ]]
then
    exit 4
fi
if ! sudo -kSp '' [ 1 ] <<<"${sudo_password}" 2>/dev/null
then
    exit 4
fi
# notify
notify-send "Applying updates..." -i gtk-dialog-info -t 1000 -u normal &
# proceed to update
cuser="${SUDO_USER:-$USER}"
sudo -Sp ''  sudo /usr/local/bin/MyScript <<<"${sudo_password}"
# option to view log
new_update="$(cat /home/$USER/.updates.log | grep 'MyScript completed at ' | awk -F ' at ' '{print $2}')"
zenity --question --text "MyScript updated at $new_update\n\nWould you like to view the log file now?"
if [ $? = 0 ]
then
# display log
    zenity --text-info --filename=/home/$USER/.updates.log --width 680 --height 680
fi
fi
fi

Na verdade, parece que a parte complicada para mim está aqui:

if [ "$changes" != 0 ]; then

Eu quero simplesmente exibir uma mensagem como "Nenhuma atualização encontrada, saindo ..." se esse arquivo não contiver nenhuma linha que comece com "http", mas isso simplesmente criará uma linha em branco na caixa de diálogo da pergunta do zenity. Parece que preciso modificar essa linha e também adicionar outro comando em "else", mas não sei como e onde ...

    
por Sadi 06.10.2015 / 12:36

2 respostas

2

Não posso testar o resto do seu script, pois não tenho os dados necessários e nem sei o que ele faz, mas essa linha está certamente errada:

changes="$(cat /home/$USER/.updates.log | grep http)"

Isso salvará a saída de seu comando grep em $changes , não o número de vezes que a string foi encontrada, mas as linhas reais retornadas. Por exemplo:

$ cat file 
one http
two http
three http
$ changes=$(cat file | grep http)
$ echo "$changes" 
one http two http three http

Como você pode ver acima, $changes é apenas cada linha correspondente do arquivo concatenado em uma única variável. O que você queria era algo como (não há necessidade de cat , a propósito, grep pode pegar um nome de arquivo como entrada):

$ changes=$(grep -c http file)
$ echo $changes 
3

A opção -c faz grep imprimir o número de linhas correspondentes em vez das próprias linhas. Alternativamente, você pode passar a saída através de wc -l para contar as linhas:

changes=$(grep http file | wc -l)

Qualquer um fará e você poderá verificar se $changes é maior que 0:

if [ "$changes" -gt 0 ]]; then 
        ...
fi

Se você quiser exibir as alterações, use sua abordagem original, mas não a compare a 0. Em vez disso, use -z para verificar se a variável está vazia:

changes=$(grep http /home/$USER/.updates.log)
## If $changes is empty
if [ -z "$changes" ]
then
     notify-send "Found no updates; exiting..." -i gtk-dialog-info -t 1000 -u normal &
     exit
else
     zenity --question --text "Changes found in:\n$changes\n\nWould you like to update now?"
    ...
fi
    
por 06.10.2015 / 13:10
0

Sobre o problema ONDE para colocar o resto da condição, a dica é sempre respeitar o recuo, certamente facilitando a tarefa:)

Eu não testei (posso estar errado), mas eu tentaria algo assim para começar:

changes="$(cat /home/$USER/.updates.log | grep http)"
if [ "$changes" != 0 ]; then
  zenity --question --text "Changes found in:\n<i>$changes</i>\n\nWould you like to update now?"
  if [ $? = 0 ]; then
    ## password
    sudo_password="$(gksudo --print-pass --description 'MyScript' -- : 2>/dev/null)"
    ## check for null entry or cancellation
    if [[ ${?} != 0 || -z ${sudo_password} ]]; then
      exit 4
    fi
    if ! sudo -kSp '' [ 1 ] <<<"${sudo_password}" 2>/dev/null; then
      exit 4
    fi
    ## notify
    notify-send "Applying updates..." -i gtk-dialog-info -t 1000 -u normal &
    ## proceed to update
    cuser="${SUDO_USER:-$USER}"
    sudo -Sp ''  sudo /usr/local/bin/MyScript <<<"${sudo_password}"
    ## option to view log
    new_update="$(cat /home/$USER/.updates.log | grep 'MyScript completed at ' | awk -F ' at ' '{print $2}')"
    zenity --question --text "MyScript updated at <b><i>$new_update</i></b>\n  \nWould you like to view the log file now?"
    if [ $? = 0 ]; then
      ## display log
      zenity --text-info --filename=/home/$USER/.updates.log --width 680 --height 680
    fi
  fi
## Here is where you can choose what to do if there are no results
else
  zenity --text-info "No updates found; exiting..." 
fi
    
por 06.10.2015 / 13:01