在 shell 脚本中解析 while 循环输出

在 shell 脚本中解析 while 循环输出

我正在尝试编写一个 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"

在第一次循环中就处理了所有问题。这可能是连续四次循环失败的原因。

相关内容