【问题标题】:bash script written in windows won't run properly, but will if written in linux用 Windows 编写的 bash 脚本无法正常运行,但如果用 linux 编写则可以
【发布时间】:2020-01-19 22:39:24
【问题描述】:

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

Link to script on github

无法正常工作的部分

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

【问题讨论】:

  • 你试过运行diff来比较vim-version和notepad++-version吗?

标签: bash for-loop


【解决方案1】:

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

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

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

运行 dos2unix 然后再试一次。

【讨论】:

  • 这并不能解决问题。这就是我最初的想法。
  • 当你将它从 notpad++ 上传到 github 然后你将它克隆到 linux 运行 dos2unix 并不能解决问题?有趣的是,它在 linux 中编写时是如何工作的。我要说的是你在 for 循环内的 case 内嵌套 case 的方式,我认为解析输入参数是错误的。然而,它在用 linux 编写时可以工作的事实让我失望。抱歉,我无法提供帮助,但如果脚本工作,这一定只是一个奇怪的问题。
  • 我有一张我用来在 notepad++ 中重新创建代码的图片,因为目前将其从 VM 中移除有点困难。我唯一能想到的是notepad ++如何保存文件与vim如何保存文件。我可能必须安装 git 并在 vim 中从头开始重写它才能使其正常工作。
  • 这适用于我在 Windows 中编写并尝试在 WSL 中执行的 bash 脚本,但无法弄清楚发生了什么,然后我突然意识到...
【解决方案2】:

第一个变量列为ARGCASE,而所有其他引用列为ARGMODE。不使用正确的变量会导致一个不会做任何事情的循环,因为ARGMODE 什么都没有,而ARGCASE 具有适当的值以使案例按预期工作。

【讨论】:

  • 在重写文件以使其正常工作时发现了这一点。像我一样发布答案,所以其他有类似问题的人应该查看变量名,而不是像我一样假设它是其他东西。修复一个变量解决了这个问题。所有发布的代码您不必按照链接在提供的代码块中查看。
猜你喜欢
  • 2015-08-24
  • 2016-05-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-06-11
  • 1970-01-01
  • 1970-01-01
  • 2022-11-24
相关资源
最近更新 更多