首页 > 解决方案 > 尝试将 for /f "tokens=*" %%a in ... 转换为 SHELL

问题描述

我正在尝试借助这种转换器手册将整个 BATCH脚本转换为 SHELL 脚本。

我几乎完成了,但我正在努力转换这个 FOR LOOP:

for /f "tokens=*" %%a in ('%adb% shell mkdir /usr/ui/^|find /i "File exists"') do (
    if not errorlevel 1 goto :cannot_patch
)

我知道那for /f

循环命令:针对一组文件 - 有条件地针对每个项目执行命令。

但是,由于我是 SHELL SCRIPT(以及 BASH)的菜鸟,我最好的尝试是:

for -f "tokens=*" a in ( '$ADB shell mkdir /usr/ui/^|find /i "File exists"' ); do
    if [ $? -nq 1 ]
    then
        cannot_patch
    fi
done

这不起作用,导致Syntax error: Bad for loop variable.

任何提示、链接或建议将不胜感激。

编辑

我试图了解到底('%adb% shell mkdir /usr/ui/^|find /i "File exists"')在做什么。

我以为那些是 sh 命令,但事实证明我错了,那find /i是试图

在文件中搜索(ing)文本字符串并显示找到它的所有行。

( https://ss64.com/nt/find.html )

|是管道运算符,如果命令尝试创建已经存在的目录,"File exists" 应该是抛出的错误。mkdir

所以我想我可能可以更容易地写这个,但是,^符号在/usr/ui/^做什么?它是正则表达式吗?

编辑2

@glenn_jackman似乎确实是对的:也许我最好理解代码试图做什么。

因此,为了提供更好的上下文,这里是原始批次的更多代码:

for /f "tokens=*" %%a in ('%adb% shell mkdir /usr/ui/^|find /i "File exists"') do (
    if not errorlevel 1 goto :cannot_patch
)
:cannot_patch
echo Error: Cannot create directory!
echo Patch is already installed or system files exist and might be overwritten.
choice /m "Do you want to continue"
if errorlevel 2 goto :END
goto :continue_patch

据我了解,代码正在尝试运行该adb shell mkdir命令,如果它失败(抛出“文件存在”错误),它将询问用户他/她是否想继续。

所以在这种情况下,我想真正的问题是尝试编写一个在 SH 中执行相同操作的代码,可能不需要 for 循环。

不过,我正在寻找它......

标签: bashshellbatch-filecmd

解决方案



推荐阅读