如何编写循环查找Dock应用并删除(基于dockutil工具)
解决dockutil处理多字应用名称的问题
你的问题出在两个核心点:
- 应用列表的定义方式错误,导致多字名称被Shell按空格拆分成多个循环项
- 依赖
awk '{print $3}'判断是否找到应用,这种方式仅适用于单字应用名
修正后的脚本
# 指定要从Dock移除的应用名称(用数组存储支持多字名称) apps=("Terminal" "Microsoft Word" "Microsoft Outlook") for app in "${apps[@]}" do # 直接通过dockutil的退出状态判断应用是否存在 if /usr/local/bin/dockutil --find "$app" >/dev/null 2>&1; then /usr/local/bin/dockutil --remove "$app" --allhomes --no-restart echo "$app 已从Dock移除。" else echo "$app 未在Dock中找到。" fi done
关键修改说明
用数组存储应用列表:
原写法apps="Terminal 'Microsoft Office'"会被Shell按空格分割成Terminal、'Microsoft、Office'三个独立项,导致多字应用名称被错误拆分。改用数组apps=("Terminal" "Microsoft Word" ...)可以完整保留多字名称的完整性。通过命令退出状态判断结果:
dockutil --find <应用名>如果找到目标应用,命令的退出状态为0(执行成功);未找到则返回非0值。用if /usr/local/bin/dockutil --find "$app" >/dev/null 2>&1;可以直接判断结果,完全不受应用名称的单词数量影响。>/dev/null 2>&1用于屏蔽命令的输出和错误信息,只保留退出状态供判断使用。
替代方案(基于输出内容判断)
如果你更倾向于通过输出内容判断,也可以用grep检查输出中是否包含was found,写法如下:
for app in "${apps[@]}" do if /usr/local/bin/dockutil --find "$app" | grep -q "was found"; then /usr/local/bin/dockutil --remove "$app" --allhomes --no-restart echo "$app 已从Dock移除。" else echo "$app 未在Dock中找到。" fi done
grep -q表示静默模式,只返回退出状态,不输出匹配内容,同样能可靠判断是否找到应用。
内容的提问来源于stack exchange,提问作者Albert Chan
相关产品推荐
相关产品推荐

