【问题标题】:.BAT To .SH Converting?.BAT 到 .SH 转换?
【发布时间】:2013-07-27 23:38:52
【问题描述】:

好吧,我已经编写了一个 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`

【问题讨论】:

  • 在 Linux 上没用。你应该从头开始写。
  • 我想过,但是我真的对shell脚本几乎一无所知,我有点好奇,虽然我不能用python写吗?
  • 是的,你可以使用 Python。
  • :) 好的,谢谢您,先生,我就这么做。这个网站允许一个ups吗?或者如果不是,它会起作用再次感谢您的快速回复
  • 如果你打算让它变得更复杂,你会想要切换到 Python,但如果它只是需要直接翻译,那么 shell 脚本就足以完成这项任务。至于“一个人”,我不确定您的意思。如果您的意思是对评论或答案进行投票,请参阅本网站的 about page。在我写这篇文章时,您的问题有两个反对意见,可能是因为您基本上是在要求我们为您重写您的脚本,这不是一个明确、具体的问题。对你来说幸运的是,我今天很无聊,无论如何都要做。 :)

标签: linux windows batch-file sh


【解决方案1】:

转换为 Bourne shell 非常简单:

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

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

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

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

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

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

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

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

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

  8. 在 Bourne shell 中没有 goto。我们不需要它,因为 Bourne shell 有不错的控制结构。我认为a case statement 表达了您内部选择代码的意图,an infinite while loop 表达了外部“继续这样做,直到他们遇到q”方案。

  9. 我看不到代码流如何到达最后的“按任意键继续”位,因此我将其删除。如果我错了,PAUSE 的大致等价物是read -n 1 -s

  10. 我已经更改了对外部程序的调用,删除了 .exe 并将 .\ 更改为 ./ 以匹配 Linux 上的操作方式。您仍然需要提供VisualBoyAdvance.exedesmume.exe 的Linux 等效项。

结果如下所示:

#!/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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-05-10
    • 1970-01-01
    • 2014-01-19
    • 1970-01-01
    • 2012-10-22
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多