Ошибка при проверке всех условий (профилей конфигурации)
Хорошо, теперь у меня есть такая настройка, но все же она дает мне; выход; выйти
[Процесс завершен]
при запуске через терминал я знаю, что есть профили конфигурации, которых нет на моем компьютере, которые должны заставить сценарий продолжать или, скорее, продолжать цикл. Что это не происходит?
Заранее спасибо....!
Вот что у меня есть:
#!/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}'
,