Linux Shell脚本:意外的文件结尾

Linux Shell脚本:意外的文件结尾,linux,shell,Linux,Shell,以下是我的shell脚本: if [ $# != 2 ] ; then echo "$0 <SSID> <passphrase>" exit fi wpa_cli -iwlan0 disconnect wpa_cli -iwlan0 remove_network all wpa_cli -iwlan0 add_network wpa_cli -iwlan0 set_network 0 mode 0 wpa_cli -iwlan0 set_network 0

以下是我的shell脚本:

if [ $# != 2 ] ; then
    echo "$0 <SSID> <passphrase>"
    exit
fi
wpa_cli -iwlan0 disconnect
wpa_cli -iwlan0 remove_network all
wpa_cli -iwlan0 add_network
wpa_cli -iwlan0 set_network 0 mode 0
wpa_cli -iwlan0 set_network 0 ssid \"$1\"
wpa_cli -iwlan0 set_network 0 auth_alg OPEN
wpa_cli -iwlan0 set_network 0 key_mgmt WPA-PSK
wpa_cli -iwlan0 set_network 0 proto RSN
wpa_cli -iwlan0 set_network 0 psk \"$2\"
wpa_cli -iwlan0 set_network 0 scan_ssid 1
wpa_cli -iwlan0 select_network 0
wpa_cli -iwlan0 enable_network 0
wpa_cli -iwlan0 reassociate
wpa_cli -iwlan0 status
如果我手动运行这些命令,一切正常


我做错了什么

我可以复制粘贴您的脚本并将其保存在DOS模式下,以使其具有CRLF行结尾,从而重现您的问题。 然后,我得到了与您完全相同的错误:

第19行:语法错误:意外的文件结尾

要解决此问题,请通过在脚本上运行
dos2unix
,或执行以下操作来解决行结束:

tr -d '\r' < script.sh > cleaned.sh && mv cleaned.sh script.sh

所有shell脚本都应该有这样一行(称为shebang)。

可能文件末尾有一个奇怪的不可见字符。发生在我身上的一次。。。也没有必要写
\“
,只需写
,而不是“不需要
\”
,这完全是不正确的。这会导致意外的文件结尾吗?这只是一种预感。因为你推了我,我测试了我的理论,可以重现OP的问题(请参阅我的更新).我不知道为什么错误信息如此神秘。这很少见,因为通常一个脚本有一个shebang,在这种情况下,错误信息是不同的,在这种情况下,更容易看出问题是行结尾。OP的脚本没有shebang,这增加了混乱。
tr -d '\r' < script.sh > cleaned.sh && mv cleaned.sh script.sh
#!/bin/sh