用windows编写的bash脚本赢得';不能正常运行,但如果用linux编写,则会正常运行

用windows编写的bash脚本赢得';不能正常运行,但如果用linux编写,则会正常运行,bash,for-loop,Bash,For Loop,我有一个安装ArchLinux的脚本。我已经在运行于windows的VM中测试了该脚本。当我在VM中测试部件并在windows中编写时。我一直在使用的应用程序是windows中的Notepadd++和Linux虚拟机上的vim。失败的部分是开始时的for循环,其他一切都按预期运行。如果我在linux中编写for循环,它就会正常工作。如果我在windows中编写并复制它(通过github),该部分会被跳过,就像它从未出现过一样,但我可以在vim中看到它。在windows中编写它一直是我编写脚本的主

我有一个安装ArchLinux的脚本。我已经在运行于windows的VM中测试了该脚本。当我在VM中测试部件并在windows中编写时。我一直在使用的应用程序是windows中的Notepadd++和Linux虚拟机上的vim。失败的部分是开始时的for循环,其他一切都按预期运行。如果我在linux中编写for循环,它就会正常工作。如果我在windows中编写并复制它(通过github),该部分会被跳过,就像它从未出现过一样,但我可以在vim中看到它。在windows中编写它一直是我编写脚本的主要方式,所以我真的不知道为什么只有这部分有问题

不正常工作的部分

ARGCASE="CHECK"
VMINSTALL="FALSE"
RSAUPASS="FALSE"
for arg in "$@"
do
    case $ARGMODE in
        CHECK)
            case $arg in
                -u | --username)
                ARGMODE="USERNAME"
                ;;
                -p | --userpass | --userpassword)
                ARGMODE="USERPASS"
                ;;
                -r | --rootpass | --rootpassword)
                ARGMODE="ROOTPASS"
                ;;
                -vm)
                VMINSTALL="TRUE"
                ;;
                -h | --help | *)
                echo "This Script is for automating the install of arch linux"
                echo "-u\t--username\n\tSet the user name of the users account"
                echo "-p\t--userpass\t--userpassword\n\tSet the user password of the users account"
                echo "-r\t--rootpass\t--rootpassword\n\tSet the root user's password"
                echo "-vm\n\tThis is for when instaling to a virtual machine as some items are not needed since host machene takes care of them"
                echo "-rsau\n\tSet Root user password to be the same as user\n\tNOTE: This is not recomended as this could be a security risk"
                echo "-h\t--help\n\tshow this text"
                exit 0
                ;;
            esac
            ;;
        USERNAME)
            USERNAME=$arg
            ;;
        USERPASS)
            USERPASS=$arg
            ;;
        ROOTPASS)
            ROOTPASS=$arg
            ;;
    esac
done

使用windows计算机编写bash脚本可能会导致编码问题

如果选择使用windows文本编辑器,然后将该文档传输到Unix计算机(如Linux),则必须更改编码

为此,有一个名为dos2unix的内置工具


运行dos2unix,然后重试。

第一个变量列为
ARGCASE
,而所有其他引用列为
ARGMODE
。未使用正确的变量导致循环无法执行任何操作,因为
ARGMODE
没有任何内容,并且
ARGCASE
具有使案例按预期工作的适当值。

这无法解决问题。这就是我最初的想法。当你从notpad++将它上传到github its,然后你将它克隆到linux运行的dos2unix上时,这并不能解决问题吗?有趣的是,在linux中编写时它是如何工作的。我想说的是,将case嵌套在for循环的case中的方式,我假设是解析输入参数的方式写错了。然而,它在linux中运行的事实让我很反感。很抱歉,我无法提供帮助,但如果脚本正常工作,这一定是一个奇怪的问题。我有一张图片,我曾经在notepad++中重新创建代码,因为现在要将其从虚拟机上删除有点困难。我唯一能想到的是记事本++如何保存文件,而vim如何保存文件。我可能必须安装git并在vim中从头开始重写它才能使其工作。您是否尝试运行
diff
来比较vim版本和notepad++-版本?在重写文件以使其工作时发现了这一点。像我一样发布答案,其他有类似问题的人应该查看变量名,而不是像我一样假设它是其他的东西。修正了一个变量,解决了这个问题。所有代码都是随代码一起发布的,您不必按照链接在提供的代码块中查看。