将.BAT转换为.SH?

5

我编写了一个批处理文件,用于在游戏机不在身边时加载我的宝可梦备份,但是我现在转换到了Linux系统,我遇到了问题:将 .BAT 文件转换成 .SH 后无法正常工作(我已经从 .exe 文件反编译得到源代码)。而且我无法找到有关如何使用 Shell 命令与 BAT 文件中的相同功能的详细信息:/。我还想知道如何将 SH 文件设置为从当前目录加载,并在 Wine 中运行该程序。

这是我的 .BAT 文件,在 Windows 系统下可以完美地运行,但是在 Wine 或者 CMD 提示符下移植到 Wine 后就会拒绝运行:

`:MENU
CLS

ECHO ============= RawX GBA's =============
ECHO -------------------------------------
ECHO 1.  Pokemon Crystal
ECHO 2.  Pokemon Green
ECHO 3.  Pokemon Gold
ECHO 4.  Pokemon Pikachu
ECHO 5.  Pokemon Ruby
ECHO 6.  Pokemon Chaos Black
Echo 7.  Pokemon Silver
ECHO 8.  Pokemon White (NDS)
ECHO 9.
Echo 10.
Echo 11.
Echo 12. Pokemon Black (NDS)
ECHO ==========PRESS 'Q' TO QUIT==========
ECHO.
color fc

SET INPUT=
SET /P INPUT=Please select a number:

IF /I '%INPUT%'=='1' GOTO Selection1
IF /I '%INPUT%'=='2' GOTO Selection2
IF /I '%INPUT%'=='3' GOTO Selection3
IF /I '%INPUT%'=='4' GOTO Selection4
IF /I '%INPUT%'=='5' GOTO Selection5
IF /I '%INPUT%'=='6' GOTO Selection6
IF /I '%INPUT%'=='7' GOTO Selection7
IF /I '%INPUT%'=='8' GOTO Selection8
IF /I '%INPUT%'=='9' GOTO Selection9
IF /I '%INPUT%'=='10' GOTO Selection10
IF /I '%INPUT%'=='11' GOTO Selection11
IF /I '%INPUT%'=='12' GOTO Selection12
IF /I '%INPUT%'=='Q' GOTO Quit

CLS

ECHO ============INVALID INPUT============
ECHO -------------------------------------
ECHO Please select a number from the Main
echo Menu [1-9] or select 'Q' to quit.
ECHO -------------------------------------
ECHO ======PRESS ANY KEY TO CONTINUE======

PAUSE > NUL
GOTO MENU

:Selection1

:1
".\VisualBoyAdvance.exe"  ".\Pokemon Crystal.zip"
goto menu

:Selection2

:2
".\VisualBoyAdvance.exe"  ".\Pokemon Green.zip"
goto menu

:Selection3

".\VisualBoyAdvance.exe"  ".\Pokemon Gold.zip"
goto menu

:Selection4

".\VisualBoyAdvance.exe"  ".\Poke'mon Pikachu.zip"
goto menu

:Selection5

".\VisualBoyAdvance.exe"  ".\Pokemon Ruby.zip"
goto menu

:Selection6

".\VisualBoyAdvance.exe"  ".\Pokemon - Chaos Black.zip"
goto menu

:Selection7

".\VisualBoyAdvance.exe"  ".\Pokemon Silver.zip"
goto menu


:Selection8

".\desmume.exe"  ".\PokeWhite.zip"
goto menu

:Selection12

".\desmume.exe"  ".\PokeBlack.zip"
goto menu






:Quit
CLS

ECHO ==============THANK YOU===============
ECHO -------------------------------------
ECHO ======PRESS ANY KEY TO CONTINUE======

PAUSE>NUL
EXIT`

1
在Linux上毫无用处,你应该从头开始编写。 - David Jashi
我考虑过这个问题,但是我对shell脚本几乎一无所知,不过我一直很好奇,我能不能用Python来写呢? - Cody Yakel
是的,你可以使用Python。 - David Jashi
好的,谢谢您先生,我会这样做的。这个网站允许一次性上传吗?如果不行,那应该怎么做呢?再次感谢您的快速回复。 - Cody Yakel
1
如果您计划使其更加复杂,那么您应该转向Python,但如果只需要进行简单的翻译,shell脚本已经足够完成任务了。至于“one ups”,我不确定您的意思。如果您是指一种点赞评论或答案的方式,那么这个网站的关于页面已经涵盖了这个问题。当我写这篇文章时,您的问题有两个反对票,可能是因为您基本上要求我们为您重写脚本,这不是一个清晰、具体的问题。幸运的是,今天我很无聊,所以我还是做了。 :) - Warren Young
1个回答

20

转换为 Bourne Shell 脚本非常简单:

  1. 在文件开头添加 #!/bin/sh 或类似文本,告诉 Linux 使用哪个解释器。与 Windows 不同,Linux 中存在多个命令行 shell 和多个脚本解释器。

  2. 相当于 cmd.exe 命令的 CLS 在 Linux 中为 clear

  3. Linux 区分大小写,因此所有的 ECHO 命令都必须小写。如果我在翻译版中保留了你的 IF 语句,它们也必须是小写的。

  4. 在 shell 脚本中使用 echo 命令不仅仅是字面上将所有内容输出到行尾,就像在 cmd.exe 中一样。Bourne Shell 是一种更为丰富的语言:它可以对发送给命令的内容进行处理。在你的代码中,单引号(')和多个空格无法通过此命令处理。

    为避免这种问题,我已经对所有的 echo 字符串进行了双引号括起来。我本可以选择性地对有问题的字符串进行双引号处理,但为了保持一致性,我选择对所有字符串进行双引号处理,以免你误认为 Bourne Shell 中的 echo 命令需要使用双引号。

    如果我不是为了让翻译更简单,以便你可以看到批处理文件和 shell 脚本之间有更多的 1:1 对应关系,我会用一个Here Document来替换两个大块的echo 命令。

  5. Bourne Shell 中的 echo. 只是 echo。在 Bourne Shell 中,不需要点号,因为 Bourne Shell 中的 echo 没有重载以打开或关闭命令回显,就像 cmd.exe 中的 ECHO ON / OFF。 (Bourne Shell 确实有类似的特性,通过 set -x 启用。)

  6. 在 Bourne Shell 中可以获得彩色输出,但没有像 cmd.exe 中那样简单的内置命令。如果你想要漂亮的彩色菜单,你可以使用Dialog(1)来替换此脚本中的大部分代码。

  7. 在 shell 脚本中使用 read 命令获取输入;set 命令则有其他功能。

  8. Bourne Shell 中没有 goto。我们不需要它,因为 Bourne Shell 具有良好的控制结构。我认为case 语句表达了你内部选择代码的意图,而无限循环 while 表示外部“一直这样做,直到按下 q”方案。

  9. 我没有看到程序流程如何到达你在末

    #!/bin/sh
    clear
    
    while true do
        echo "============= RawX GBA's ============="
        echo "-------------------------------------"
        echo "1.  Pokemon Crystal"
        echo "2.  Pokemon Green"
        echo "3.  Pokemon Gold"
        echo "4.  Pokemon Pikachu"
        echo "5.  Pokemon Ruby"
        echo "6.  Pokemon Chaos Black"
        echo "7.  Pokemon Silver"
        echo "8.  Pokemon White (NDS)"
        echo "9."
        echo "10."
        echo "11."
        echo "12. Pokemon Black (NDS)"
        echo "==========PRESS 'Q' TO QUIT=========="
        echo
    
        echo -n "Please select a number: "
        read input
    
        case $input in
            1)
                ./VisualBoyAdvance "Pokemon Crystal.zip"
                ;;
    
            2)
                ./VisualBoyAdvance "Pokemon Green.zip"
                ;;
    
            # etc.
    
            q)
                clear
                exit
    
            *)
                clear
                echo "============INVALID INPUT============"
                echo "-------------------------------------"
                echo "Please select a number from the Main"
                echo "Menu [1-12] or select 'Q' to quit."
                echo "-------------------------------------"
                echo "======PRESS ANY KEY TO CONTINUE======"
        esac
    done
    

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接