Linux 未找到命令,并且不是有效的标识符
编辑:发布后,我包含的示例输入似乎没有在帖子中正确格式化。我在块引号中添加了额外的新行,以便于阅读 所以这是两部分,如果我在任何地方复制,我很抱歉。我读了两个错误的相关主题 我编写了一个与无线控制器的API接口的脚本,并将其交给了一位客户。我在两种不同风格的Linux(尽管都是Debian)上测试了该脚本,这两种版本都有效。这是完整的剧本Linux 未找到命令,并且不是有效的标识符,linux,bash,Linux,Bash,编辑:发布后,我包含的示例输入似乎没有在帖子中正确格式化。我在块引号中添加了额外的新行,以便于阅读 所以这是两部分,如果我在任何地方复制,我很抱歉。我读了两个错误的相关主题 我编写了一个与无线控制器的API接口的脚本,并将其交给了一位客户。我在两种不同风格的Linux(尽管都是Debian)上测试了该脚本,这两种版本都有效。这是完整的剧本 #!/bin/bash LOG=~/mac_add.log cOpt="-i -H Accept:application/xml -H Conte
#!/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/\(.*\),.*/\1/')"
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
#/bin/bash
LOG=~/mac\u add.LOG
cOpt=“-i-H Accept:application/xml-H内容类型:application/xml-X POST-k-u”
阅读-p“输入IP:”ipAddr
如果[[$ipAddr=~^([0-9]{1,3}.){3}[0-9]{1,3}$];然后{
echo“IP地址$ipAddr…好的”
}否则{
回显“无效IP地址”
出口
}fi
阅读-p“输入用户名:”用户
如果[[$user=~^[a-zA-Z0-9.\%+-]+@[a-zA-Z0-9.-]+\[a-zA-Z]{2,4}$];然后{
回显“用户$User…好的”
}否则{
回显“无效电子邮件地址”
出口
}fi
读取-sp“输入密码:”passwd
回声“”
阅读-p“输入域名:”域
domain=“${domain///%20}”
阅读-p“角色ID:”角色
read-p“输入MAC地址的文件:”infle
如果[!-f$infle];然后{
回显“$infle未找到”
出口
}fi
cat$inFile |读取行时;做{
name=“$(echo$line | sed's/\(.*\),.*/\1/”)
mac=“$(echo$行| sed's/*,/')”
如果[[$name=~^[a-zA-Z]{1}[a-zA-Z0-9\]+$],则{
如果[[$mac=~^([a-fA-F0-9]{2}:){5}[a-fA-F0-9]{2}$];则{
curl$cOpt$user:$passwd https://$ipAddr:3000/macdevices?活动\u域\u名称=office-d“$name$role$mac”
}否则{
echo“MAC地址$MAC无效”>>$LOG
}fi
}否则{
echo“名称$name无效”>>$LOG
}fi
}完成
输入文件是一个CSV文件。每行的格式应为“名称,MAC”。下面是我用于测试的文件的内容
姓名4,00:19:92:ab:cd:3f
姓名3,ag:10:12:31:32
姓名23214:1f:ed:ab:22
姓名1,AB:CD:EF:12:33:44
5姓名,AB:CD:EF:12:33:44
保罗·史密斯,AB:CD:EF:12:33:44
我把这个交给客户,这就是他们得到的
$bash mac-add.bsh
:未找到命令:
:未找到命令:
输入IP:redated
“:不是有效的标识符:`ipAddr
mac-add.bsh:第7行:条件表达式中的语法错误:意外的标记“(”
mac-add.bsh:第7行:`^(['
'ac-add.bsh:第7行:`if[$ipAddr=~^([0-9]{1,3}.){3}[0-9]{1,3}$]];然后{
上次退货状态:2
所以我想他们可能没有支持regex的bash版本。他们说他们运行的是4.1.3,我认为应该是。我不完全确定Linux是什么味道,但我真的只是想知道这有什么问题,这样我就可以进行移植。如果需要的话,我也愿意使用不同的语言
我最初的想法是通过删除LOG和cOpt来简化脚本,后者是因为我只是用它来让cURL调用一行。我还将删除regex检查。检查行的结尾 如果shell脚本具有Windows样式的行结尾,则类似于
foo
的行将看起来像foo^M
;当它打印错误消息foo^M:Command not found
时,^M
将光标移动到行的开头,消息的其余部分将覆盖命令名。(这里我使用^M
表示回车符)
你可以跑
bash mac-add.bsh 2>&1 | cat -A
查看包含返回字符的错误消息(如果您的cat
没有-A
选项,则查看cat-v
)
根据您的描述,Windows样式的行尾可能是在您和客户之间的某个位置添加的。您对
{
和}
的使用有点奇怪。我认为您可以将它们全部省略;您的脚本应该仍然可以工作(就像现在一样)更地道一点。谢谢你的回答。我添加大括号只是为了在文本编辑器中格式化。它允许我折叠函数和大型条件/循环。这只是一种习惯,但你是对的,它们可以被删除。我想你可能在你的答案中也找到了一些东西。我在从同一个编辑器粘贴时注意到了这一点有时我不得不对新行的角色做一些额外的努力。再次感谢!就是这样。再次感谢!