好吧,我写了一个bat文件,用于加载我的pokemon备份,当我离开我的gameboys时,但是我已经转换为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`
答案 0 :(得分:11)
转换为Bourne shell非常简单:
添加#!/bin/sh
或类似的第一行,告诉Linux使用哪个解释器。与Windows不同,除了shell之外,还有多个命令shell和更多的脚本解释器。
Linux上cmd.exe
命令CLS
的等效项为clear
。
Linux区分大小写,因此您的所有ECHO
必须为小写。如果我将IF
语句保留在翻译版本中,那么它们也必须是小写的。
echo
不仅仅是将所有内容打印到行尾,如cmd.exe
中所示。 Bourne shell是一种更丰富的语言:它可以在将命令发送到命令之前对命令后出现的内容应用含义。在您的代码中,单引号('
)和多个空格将无法在此命令处理中继续存在。
为了避免此类问题,我引用了所有echo
个字符串。我本可以有选择地完成它,只引用问题字符串,但选择双引号以保持一致性。我不希望你误以为Bourne shell 中的echo
需要双引号。
如果我对保持翻译简单不感兴趣,那么您可以在批处理文件和shell脚本之间看到更多的1:1对应关系,我会用{{echo
命令替换两个大块echo.
命令3}}
echo
在Bourne shell中只是echo
。您不需要Bourne shell中的点,因为Bourne shell中的ECHO ON/OFF
没有重载以打开和关闭命令回显,就像cmd.exe
中的set -x
一样。 (Bourne shell确实具有类似的功能,通过cmd.exe
启用。)
可以在Bourne shell中获得彩色输出,但没有像read
中那样的简单内置命令。如果您想要漂亮的彩色菜单,可以通过调用heredoc来替换此脚本中的大部分代码。
您使用set
在shell脚本中获取输入; goto
做其他事情。
Bourne shell中没有q
。我们不需要它,因为Bourne shell具有不错的控制结构。我认为dialog(1)
表达了内部选择代码的意图,而a case
statement表达了外部“继续这样做,直到他们点击PAUSE
”方案。
我不知道代码流是如何进入你的“按任意键继续”位的,所以我删除了它。如果我错了,read -n 1 -s
的粗略等价物为.exe
。
我已更改对外部程序的调用,删除.\
并将./
更改为VisualBoyAdvance.exe
以匹配Linux上的操作方式。你仍然需要提出desmume.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
的Linux等价物。
结果如下所示:
{{1}}