Ошибка при проверке всех условий (профилей конфигурации)

Хорошо, теперь у меня есть такая настройка, но все же она дает мне; выход; выйти

[Процесс завершен]

при запуске через терминал я знаю, что есть профили конфигурации, которых нет на моем компьютере, которые должны заставить сценарий продолжать или, скорее, продолжать цикл. Что это не происходит?

Заранее спасибо....!

Вот что у меня есть:

#!/bin/bash

profilesInstalled=`profiles -P|awk '/attribute/ {print $4}'`

while read line ; do

if [ "$line" = "F2CC78D2-A63F-45CB-AE7D-BF2221D41218" ];then

echo "AD Binding is present"

elif [ "$line" = "1C94DAD1-5FC7-46CE-9E09-576841C15093" ];then

echo "Energy Saver is present"

elif [ "$line" = "A0E5B977-F0AF-44C9-8001-DA0511B702B8" ];then

echo "Finder is present"

elif [ "$line" = "5E9DE5BF-34E4-4A7F-AA29-461FB0631943" ];then

echo "FV2 Redirect is present"

elif [ "$line" = "9AE91C88-D1B2-4227-9E95-80F492DCAA11" ];then

echo "Login Window/Security and Privacy is present"

elif [ "$line" = "00000000-0000-0000-A000-4A414D460003" ];then

echo "MDM Profile is present"

elif [ "$line" = "5E85BBF0-3483-4C80-A1FC-70AF20F82E7C" ];then

echo "Restrictions is present"

elif [ "$line" = "E433D546-5502-4C3F-9E5F-4732ED1F0032" ];then

echo "SAC SUBCA-01 is present"

elif [ "$line" = "5C2AE16B-D4E9-4D15-B190-3CD7B28779E8" ];then

echo "SAC SUBCA-02 is present"

elif [ "$line" = "2C620A13-DF1E-4F6A-A32B-9FA3149F8A56" ];then

echo "SAC-CA-01 is present"

elif [ "$line" = "3B44AE14-E0CE-4621-BACF-1A9C3BA4A459" ];then

echo "Screensaver is present" 

elif [ "$line" = "396A9D84-A9CA-4575-8D09-C9F054B76AF7" ];then

echo "Spotlight is present"

elif [ "$line" = "E0138F02-9A15-47BD-8CA5-7D1D0985A1A6" ];then

echo "Workday Corp is present"
fi 

exit 0

done <<<"$profilesInstalled"

2 ответа

Решение

Сначала некоторые "мета" замечания:

  • Пожалуйста, не меняйте исходный вопрос существенно, так как это может сделать недействительными существующие ответы (например , полезный ответ Этана Рейснера)
    • Вместо этого добавьте более поздние изменения в исходный вопрос и отметьте изменения как таковые.
    • Если возникает другой (дополнительный) вопрос, задайте его как отдельный новый вопрос.
  • Пожалуйста, узнайте, как правильно отформатировать ваш код - это было сделано для вас, и вам удалось снова уничтожить это форматирование с последующими изменениями.
  • Пожалуйста, прочитайте о том, как предоставить MCVE (минимальный, полный и проверяемый пример).

Не делать эти вещи:

  • значительно снижает вероятность получения необходимой вам помощи.
  • делает ваш вопрос и его ответы менее ценными для будущих читателей.

Вот очищенная версия вашего кода:

# Helper function to determine a string's element index in an array.
# SYNOPSIS
#     indexOf needle "${haystack[@]}"
# *Via stdout*, returns the zero-based index of a string element in an array of strings or -1, if not found.
# The *return code* indicates if the element was found or not.
indexOf() {
  local e ndx=-1
  for e in "${@:2}"; do (( ++ndx )); [[ "$e" == "$1" ]] && echo $ndx && return 0; done
  echo '-1'; return 1
}

# Define array of profile IDs, and parallel ID of profile names.
# Note: in bash 4+, this could be handled more elegantly with a single
#       associative array.
profileIds=( F2CC78D2-A63F-45CB-AE7D-BF2221D41218 1C94DAD1-5FC7-46CE-9E09-576841C15093
             A0E5B977-F0AF-44C9-8001-DA0511B702B8 5E9DE5BF-34E4-4A7F-AA29-461FB0631943
             9AE91C88-D1B2-4227-9E95-80F492DCAA11 00000000-0000-0000-A000-4A414D460003
             5E85BBF0-3483-4C80-A1FC-70AF20F82E7C E433D546-5502-4C3F-9E5F-4732ED1F0032
             5C2AE16B-D4E9-4D15-B190-3CD7B28779E8 2C620A13-DF1E-4F6A-A32B-9FA3149F8A56
             3B44AE14-E0CE-4621-BACF-1A9C3BA4A459 396A9D84-A9CA-4575-8D09-C9F054B76AF7
             E0138F02-9A15-47BD-8CA5-7D1D0985A1A6 )
profileNames=( "AD Binding"                        "Energy Saver"
               "Finder"                            "FV2 Redirect"
               "Login Window/Security and Privacy" "MDM Profile"
               "Restrictions"                      "SAC SUBCA-01"
               "SAC SUBCA-02"                      "SAC-CA-01"
               "Screensaver"                       "Spotlight"
               "Workday Corp" )

# Feeding the list of installed profile IDs via a process
# substitution (<(...)), loop over them and print their
# respective names.
while read -r line ; do

  # Find the line in the array of profile IDs and
  # print the corresponding name.
  if ndx=$(indexOf "$line" "${profileIds[@]}"); then
    echo "${profileNames[ndx]} is present"
  else
    echo "WARNING: Unknown profile: $line" >&2
  fi

done < <(profiles -P | awk '/attribute/ {print $4}')

Что касается того, почему ваш код не зациклен:

  • У вас есть безусловный exit 0 оператор в вашем цикле, что означает, что цикл всегда завершается после 1-й строки.
  • Из-за использования <<< чтобы заполнить список профилей, вы всегда получаете как минимум 1 строку ввода, потому что <<< добавляет завершающий символ новой строки к своему вводу. Если ввод пуст, вы получите одну итерацию с пустой строкой.

Что касается этого сообщения:

; exit; 
logout

[Process completed]

Это говорит мне две вещи:

  • Вы работаете в OSX и запускаете скрипт из Finder.
  • Скрипт не выдал никаких выходных данных (если бы был вывод, он бы напечатал между exit; а также logout линии).

Когда вы запускаете сценарий из Finder, оболочка, используемая для запуска сценария, завершается после запуска сценария - и то, остается ли его окно терминала открытым или нет, зависит от настроек терминала - в вашем случае окно остается открытым, но, поскольку оболочка закрылась, вы больше не можете с ней взаимодействовать.

В любом случае, ваш конкретный скрипт должен давать одинаковые результаты, независимо от того, запускается он из терминала напрямую или через Finder.

Вам нужно пространство вокруг = в этих тестах. Этот первый тест всегда будет проходить как написано.

Вы также должны процитировать "$line" переменное расширение.

Если вы не используете $profilesInstalled где-то еще вам не нужна эта переменная и может просто передать profiles трубопровод к while цикл напрямую.

Вы также можете заменить grep в этом трубопроводе с awk '/attribute/ {print $4}',

Другие вопросы по тегам