4

好吧,我已经编写了一个 bat 文件,用于在我离开我的游戏男孩时加载我的 pokemon 备份,但是我已经转换为 linux,并且在我的 exe 中获取 .BAT 文件时遇到了问题(我我已经将 exe 反编译回源代码)以作为 .SH 工作,我真的找不到太多关于如何使用 shell 命令作为它们在 BAT 文件中的相同功能:/ 我也很想知道如何将 SH 文件设置为从当前目录加载并在 wine 中运行所述程序。

这是我的 .BAT 文件,它在 windows 下 100% 完美运行,但拒绝在 wine 下运行或在 wine 下可移植的 CMD 提示符

`: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`
4

1 回答 1

19

转换为 Bourne shell 非常简单:

  1. 添加#!/bin/sh或与第一行类似,告诉 Linux 使用哪个解释器。与 Windows 不同的是,除了 shell 之外,还有不止一个命令 shell,以及更多的脚本解释器。

  2. cmd.exe命令CLS的等效项clear在 Linux 上。

  3. Linux 是区分大小写的,所以你所有的ECHOs 都必须是小写的。如果我将您的IF陈述保留在翻译版本中,它们也必须是小写的。

  4. echo在 shell 脚本中,不只是将所有内容从字面上打印到行尾,如cmd.exe. Bourne shell 是一种更丰富的语言:它可以在将命令发送到命令之前将含义应用于命令之后出现的内容。在您的代码中,单引号 ( ') 和多个空格不会在此命令处理中继续存在。

    为避免此类问题,我已将您的所有echo字符串都用双引号引起来。我本可以有选择地做到这一点,只双引号问题字符串,但选择双引号以保持一致性。我不希望您误以为echo在 Bourne shell 中需要双引号。

    如果我对保持翻译简单不感兴趣,那么您可以看到批处理文件和 shell 脚本之间更多的 1:1 对应关系,我会用heredoc替换两个大echo命令块。

  5. echo.只是echo在 Bourne shell 中。你不需要 Bourne shell 中的点,因为echo在 Bourne shell 中没有重载来打开和关闭命令回显,就像ECHO ON/OFFcmd.exe. (Bourne shell 也有类似的功能,通过 启用set -x。)

  6. 可以在 Bourne shell 中获得彩色输出,但没有像cmd.exe. 如果您想要漂亮的彩色菜单,您可以将此脚本中的大部分代码替换为调用dialog(1).

  7. 您用于read在 shell 脚本中获取输入;set做其他事情。

  8. Bourne shell中没有goto。我们不需要它,因为 Bourne shell 有不错的控制结构。我认为一个case语句表达了你内部选择代码的意图,一个无限while循环表达了外部“继续这样做直到他们命中q”方案。

  9. 我看不到代码流如何到达最后的“按任意键继续”位,所以我删除了它。如果我错了,大致相当于PAUSEis read -n 1 -s

  10. 我已经更改了对外部程序的调用,删除.exe并更改.\./以匹配 Linux 上的操作方式。你仍然需要想出VisualBoyAdvance.exedesmume.exe.

结果如下所示:

#!/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
于 2013-07-28T00:41:10.637 回答