繁体   English   中英

列表上的Bash循环命令

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM