Команда Bash loop в списке - PullRequest
       5

Команда Bash loop в списке

0 голосов
/ 26 января 2012

Я на OS X использую bash и хочу прочитать данные в ключе, встроенном в каждое приложение в каталоге Applications.В результате команда «по умолчанию» пытается применить себя ко всему списку вместо каждого возвращенного приложения.

#!/bin/bash

# appList=$(ls /Applications)

for APPS in "$( ls /Applications )" ; do
        result=$(defaults read /Applications/"$APPS"/Contents/Info DTPlatformBuild)
done

echo result is $result

exit 0

Любая помощь приветствуется.

Ответы [ 3 ]

1 голос
/ 26 января 2012

Я бы предложил не использовать команду ls для зацикливания, поскольку она подвержена ошибкам.Запустите ваш цикл следующим образом, чтобы найти приложение рекурсивно:

find /Applications -name "*.app" -print0 | while IFS= read -r -d '' APP
do
    defaults read "$APP/Contents/Info" DTPlatformBuild
done

Поскольку все, что вас интересует, выводит результат, нет необходимости сохранять выходные данные команды по умолчанию в переменной, а затем выводить ее.

1 голос
/ 26 января 2012

Помещение кавычек вокруг чего-то вроде "$( ls /Applications )" заставляет оболочку обрабатывать цитируемую вещь как один аргумент, а не разбивать ее на пробелы на несколько аргументов. Таким образом, ваш цикл for будет выполнен только один раз, а для APPS будет задан весь список приложений, а не один раз для каждого приложения. Если вы удалите кавычки, он будет запускаться один раз для каждого приложения, если у приложений нет пробелов в их именах. К сожалению, если в именах есть пробелы, это приведет к разрыву имени в пробелах и не будет работать должным образом.

Безопасное обращение с именами файлов с пробелами в них - боль в оболочке, поэтому рекомендуется никогда не использовать пробелы в именах файлов. К сожалению, Microsoft и Apple не следуют этому совету. В этом случае вы могли бы сделать что-то вроде:

ls /Applications | while read APPS; do
    result=...whatever
done

Еще одна проблема с вашим сценарием (как написано) заключается в том, что он будет сохранять результат в каждой итерации, перезаписывая предыдущий результат. Поэтому содержимое $result в конце, которое вы печатаете, будет просто результатом последней итерации.

0 голосов
/ 27 января 2012

Я собираюсь пойти с ниже.Текстовый файл «appleApps.txt» - это просто список приложений Apple по умолчанию в новой сборке, которые воздерживаются от поиска.У действующего приложения компании будет новый ключ , вставленный в файл "Info.plist" с логическим , установленным в true .
Таким образом, теперь мы имееммеханизм, позволяющий сообщать о том, устанавливают ли пользователи свои собственные копии приложений, мы уже сами упаковываем.

#!/bin/bash
echo " "
echo " "
rm -f /tmp/validApps /tmp/notValid
find /Applications -name "*.app" | grep -v -F -f /Library/Application\ Support/CompanyData/appleApps.txt | while read APP
do
appVersion=`defaults read "$APP/Contents/Info" Company 2>/dev/null`
if test "$appVersion" = 1 ; then
    echo "$APP : $appVersion" >> /tmp/validApps
else
    echo "$APP" >> /tmp/notValid
fi
done

echo " "
echo " "

result=$(cat -n /tmp/validApps)
notValidResult=$(cat -n /tmp/notValid)

printf "%s\n" "Our packaged Applications are:" "$result"
echo " "
echo " "
printf "%s\n" "User installed Applications are:" "$notValidResult"
echo " "

rm -f /tmp/validApps /tmp/notValid

exit 0

Спасибо за советы, что касается моих ошибок с $result

Я прочиталпочему бы нам не ls и научились не делать этого, как подсказывают @chris и @ anubhava

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...