Новичок пытается написать простой графический интерфейс для простого сценария bash

У меня есть сценарий bash, который приводит к некоторым системным изменениям, включающим список URL-адресов, начинающихся с «http», и я пытаюсь написать для него графический интерфейс.

Я застрял в следующей части:

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 

На самом деле мне кажется, что эта сложная часть здесь:

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

Я хочу просто отобразить сообщение типа «Нет обновлений найдено, выходя …», если этот файл не содержит строк, начинающихся с «http», но это просто создает пустую строку в диалоговом окне вопроса zenity. Кажется, мне нужно изменить эту строку, а также добавить еще одну команду под «else», но я просто не знаю, как и где …

Я не могу проверить остальную часть вашего скрипта, так как у меня нет необходимых данных и даже не знаю, что он делает, но эта строка, конечно, неверна:

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

Это сохранит вывод вашей команды grep в $changes , а не в количестве раз, когда была найдена строка, но фактические строки вернулись. Например:

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

Как вы можете видеть выше, переменные $changes – это только каждая соответствующая строка из файла, объединенного в одну переменную. То, что вы хотели, было чем-то вроде (нет необходимости в cat , кстати, grep может принимать имя файла как вход):

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

Переключатель -c позволяет grep печатать количество совпадающих строк вместо самих линий. Кроме того, вы можете передавать выходные данные через wc -l для подсчета строк:

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

Либо один будет делать, и теперь вы сможете проверить, больше ли $changes больше 0:

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

Если вы хотите отобразить изменения, используйте оригинальный подход, но не сравнивайте его с 0. Вместо этого используйте -z чтобы проверить, является ли переменная пустой:

 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 

О проблеме ГДЕ, чтобы поставить остальное условие, намек на то, чтобы всегда уважать отступы, это, безусловно, облегчает задачу:)

Я не тестировал его (я мог ошибаться), но я бы попробовал что-то вроде этого для начала:

 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