![在 shell 脚本中解析 while 循环输出](https://linux22.com/image/1598960/%E5%9C%A8%20shell%20%E8%84%9A%E6%9C%AC%E4%B8%AD%E8%A7%A3%E6%9E%90%20while%20%E5%BE%AA%E7%8E%AF%E8%BE%93%E5%87%BA.png)
我正在尝试编写一个 shell 脚本,用于从我的手机中卸载 Android 应用程序。如果可能的话,我希望输出更易于阅读。我将在底部包含我所寻找的期望输出。
删除文件
#!/bin/sh
start=$(date +%s.%N)
packages=$(cat packages.txt)
count=0
printf "*** uninstalling packages defined in packages.txt ***\nPlease wait"
for app in $packages; do
adb uninstall --user 0 "$packages"
count=$((count+1))
done
duration=$(echo "$(date +%s.%N) - $start" | bc)
execution_time=`printf "%.2f seconds" $duration`
printf "Script Execution Time: $execution_time\n"
printf "Uninstalled $removed out of $count packages\n"
示例 packages.txt
com.google.android.webview \
com.samsung.android.lool \
com.google.android.apps.turbo \
com.google.android.apps.tachyon \
com.google.android.tts
电流输出
user@host: ./debloat.sh
*** uninstalling packages, please wait ***
Success
Failure [not installed for 0]
Failure [not installed for 0]
Failure [not installed for 0]
Failure [not installed for 0]
Script Execution Time: 6.93 seconds
Uninstalled out of 5 packages
user@host:
期望输出
user@host: ./debloat.sh
*** uninstalling packages, please wait ***
Script Execution Time 4.26 seconds
Uninstalled 1 out of 5 packages
user@host:
如何从循环中获取所有输出,计数Success
并将其显示在$removed
最后一行的变量中debloat.sh
?提前致谢。
答案1
这不算数Success
。这将使用退出状态来增加或不增加变量:
removed=0
…
for app …
adb uninstall --user 0 "$app" >/dev/null 2>&1 && removed="$((removed+1))"
…
done
…
foo && bar
后者命令 ( ) 仅在bar
前者 ( foo
) 返回退出状态0
(即成功)时才会运行。 在你的情况下,它就像adb … && removed=…
。 整个方法基于这样的前提:成功时adb
返回退出状态0
,失败时返回其他内容,就像任何合理的命令一样。
重定向 ( >
) 旨在保持adb
静默。考虑将 ( >>
) 附加到日志文件。
注意我正在卸载一次一个应用程序。 我猜测你的原始命令
adb uninstall --user 0 "$packages"
在第一次循环中就处理了所有问题。这可能是连续四次循环失败的原因。