未找到命令且不是有效标识符
command not found and not a valid identifier
编辑:在 posting 之后,我包含的示例输入似乎没有在 post 中正确格式化。我在块引号中添加了额外的新行以使其更易于阅读。
所以这是一个两部分,如果我在任何地方重复,我很抱歉。我阅读了与我遇到的两个错误相关的主题。
我编写了一个与无线控制器 API 接口的脚本,并将其交给了客户。我在两种不同风格的 Linux(尽管都是 Debian)上测试了脚本,两者都有效。这是完整的脚本。
#!/bin/bash
LOG=~/mac_add.log
cOpt="-i -H Accept:application/xml -H Content-Type:application/xml -X POST -k -u"
read -p "Enter IP: " ipAddr
if [[ $ipAddr =~ ^([0-9]{1,3}.){3}[0-9]{1,3}$ ]]; then {
echo "IP address $ipAddr... OKAY"
} else {
echo "Invalid IP address"
exit
} fi
read -p "Enter username: " user
if [[ $user =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]]; then {
echo "User $user... OKAY"
} else {
echo "Invalid email address"
exit
} fi
read -sp "Enter password: " passwd
echo ""
read -p "Enter name of domain: " domain
domain="${domain// /%20}"
read -p "Role ID: " role
read -p "Enter file with MAC addresses: " inFile
if [ ! -f $inFile ]; then {
echo "$inFile not found"
exit
} fi
cat $inFile | while read line; do {
name="$(echo $line|sed 's/\(.*\),.*//')"
mac="$(echo $line|sed 's/.*,//')"
if [[ $name =~ ^[a-zA-Z]{1}[a-zA-Z0-9\ ]+$ ]]; then {
if [[ $mac =~ ^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$ ]]; then {
curl $cOpt $user:$passwd https://$ipAddr:3000/macdevices?active_domain_name=office -d "<macdevice><name>$name</name><role_id>$role</role_id><address>$mac</address></macdevice>"
} else {
echo "The MAC address $mac is invalid" >> $LOG
} fi
} else {
echo "The name $name is invalid" >> $LOG
} fi
} done
输入文件是 CSV 文件。每行的格式应为“name,MAC”。以下是我用来测试的文件内容。
name4,00:19:92:ab:cd:3f
name3,ag:10:12:31:32:32
name2,3214:1f:ed:ab:22
name1,AB:CD:EF:12:33:44
5name,AB:CD:EF:12:33:44
paul smith,AB:CD:EF:12:33:44
我把这个交给客户,他们得到了这个。
$ bash mac-add.bsh
: command not found:
: command not found:
Enter IP: redacted
': not a valid identifier: `ipAddr
mac-add.bsh: line 7: syntax error in conditional expression: unexpected token `('
mac-add.bsh: line 7: syntax error near `^(['
'ac-add.bsh: line 7: `if [[ $ipAddr =~ ^([0-9]{1,3}.){3}[0-9]{1,3}$ ]]; then {
Last return status: 2
所以我想也许他们没有支持正则表达式的 bash 版本。他们说他们是 运行 4.1.3,我认为应该如此。我不完全确定是什么风格 Linux,但实际上我只是想知道这有什么问题,以便我可以处理可移植性。如果需要,我也愿意使用不同的语言。
我最初的想法是通过删除 LOG 和 cOpt 来简化脚本,后者是因为我只是用它来使 cURL 调用一行。我还会删除正则表达式检查。
检查你的行尾。
如果 shell 脚本有 Windows 风格的行结尾,像 foo
这样的行看起来像 foo^M
;当它打印错误消息 foo^M: Command not found
时,^M
会将光标移动到行的开头,消息的其余部分将覆盖命令名称。 (这里我用^M
表示回车return字符)
你可以运行
bash mac-add.bsh 2>&1 | cat -A
查看包含 return 个字符的错误消息(或者 cat -v
如果您的 cat
没有 -A
选项)。
根据您的描述,Windows 样式的行结尾可能已添加到您和客户之间的某处。
编辑:在 posting 之后,我包含的示例输入似乎没有在 post 中正确格式化。我在块引号中添加了额外的新行以使其更易于阅读。
所以这是一个两部分,如果我在任何地方重复,我很抱歉。我阅读了与我遇到的两个错误相关的主题。
我编写了一个与无线控制器 API 接口的脚本,并将其交给了客户。我在两种不同风格的 Linux(尽管都是 Debian)上测试了脚本,两者都有效。这是完整的脚本。
#!/bin/bash
LOG=~/mac_add.log
cOpt="-i -H Accept:application/xml -H Content-Type:application/xml -X POST -k -u"
read -p "Enter IP: " ipAddr
if [[ $ipAddr =~ ^([0-9]{1,3}.){3}[0-9]{1,3}$ ]]; then {
echo "IP address $ipAddr... OKAY"
} else {
echo "Invalid IP address"
exit
} fi
read -p "Enter username: " user
if [[ $user =~ ^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,4}$ ]]; then {
echo "User $user... OKAY"
} else {
echo "Invalid email address"
exit
} fi
read -sp "Enter password: " passwd
echo ""
read -p "Enter name of domain: " domain
domain="${domain// /%20}"
read -p "Role ID: " role
read -p "Enter file with MAC addresses: " inFile
if [ ! -f $inFile ]; then {
echo "$inFile not found"
exit
} fi
cat $inFile | while read line; do {
name="$(echo $line|sed 's/\(.*\),.*//')"
mac="$(echo $line|sed 's/.*,//')"
if [[ $name =~ ^[a-zA-Z]{1}[a-zA-Z0-9\ ]+$ ]]; then {
if [[ $mac =~ ^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$ ]]; then {
curl $cOpt $user:$passwd https://$ipAddr:3000/macdevices?active_domain_name=office -d "<macdevice><name>$name</name><role_id>$role</role_id><address>$mac</address></macdevice>"
} else {
echo "The MAC address $mac is invalid" >> $LOG
} fi
} else {
echo "The name $name is invalid" >> $LOG
} fi
} done
输入文件是 CSV 文件。每行的格式应为“name,MAC”。以下是我用来测试的文件内容。
name4,00:19:92:ab:cd:3f
name3,ag:10:12:31:32:32
name2,3214:1f:ed:ab:22
name1,AB:CD:EF:12:33:44
5name,AB:CD:EF:12:33:44
paul smith,AB:CD:EF:12:33:44
我把这个交给客户,他们得到了这个。
$ bash mac-add.bsh
: command not found:
: command not found:
Enter IP: redacted
': not a valid identifier: `ipAddr
mac-add.bsh: line 7: syntax error in conditional expression: unexpected token `('
mac-add.bsh: line 7: syntax error near `^(['
'ac-add.bsh: line 7: `if [[ $ipAddr =~ ^([0-9]{1,3}.){3}[0-9]{1,3}$ ]]; then {
Last return status: 2
所以我想也许他们没有支持正则表达式的 bash 版本。他们说他们是 运行 4.1.3,我认为应该如此。我不完全确定是什么风格 Linux,但实际上我只是想知道这有什么问题,以便我可以处理可移植性。如果需要,我也愿意使用不同的语言。
我最初的想法是通过删除 LOG 和 cOpt 来简化脚本,后者是因为我只是用它来使 cURL 调用一行。我还会删除正则表达式检查。
检查你的行尾。
如果 shell 脚本有 Windows 风格的行结尾,像 foo
这样的行看起来像 foo^M
;当它打印错误消息 foo^M: Command not found
时,^M
会将光标移动到行的开头,消息的其余部分将覆盖命令名称。 (这里我用^M
表示回车return字符)
你可以运行
bash mac-add.bsh 2>&1 | cat -A
查看包含 return 个字符的错误消息(或者 cat -v
如果您的 cat
没有 -A
选项)。
根据您的描述,Windows 样式的行结尾可能已添加到您和客户之间的某处。