[英]Bash loop command on list
我在OS X上使用bash并希望读取Applications目录中每个Application中嵌入的键中的数据。 结果似乎是'defaults'命令试图将自己应用于整个列表而不是每个返回的应用程序。
#!/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
任何帮助赞赏。
在"$( ls /Applications )"
类的引号周围引用shell会将引用的东西视为单个参数,而不是将空格分成多个参数。 所以你的for
循环只会执行一次, APPS
设置为整个应用程序列表,而不是为每个应用程序运行一次。 如果删除引号,只要应用程序的名称中没有任何空格,它就会为每个应用程序运行一次。 不幸的是,如果名称中有空格,它将破坏空格中的名称并且无法正常工作。
安全地处理带有空格的文件名是shell的一个难点,这就是为什么建议你永远不要在文件名中使用空格。 不幸的是,微软和苹果不遵循这一建议。 在这种情况下你可以做的一件事是:
ls /Applications | while read APPS; do
result=...whatever
done
您的脚本的另一个问题(如编写)是它将在每次迭代中存储到结果中,覆盖以前的结果。 因此,在打印结束时$result
的内容将只是最后一次迭代的结果。
我建议不要使用ls
命令进行循环,因为它容易出错。 像这样运行你的循环来递归地找到Application:
find /Applications -name "*.app" -print0 | while IFS= read -r -d '' APP
do
defaults read "$APP/Contents/Info" DTPlatformBuild
done
由于您只想回显结果,因此无需在变量中存储defaults命令的输出,然后回显它。
我打算用下面的内容。 文本文件“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
已经学会不这样做,双方@克里斯和@anubhava的提示
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.