找不到命令,而不是有效的标识符

时间:2015-01-14 00:07:36

标签: linux bash

编辑:发布之后看起来像示例输入我包括在帖子中没有正确格式化。我在块引号中添加了额外的新行,以便于阅读。

所以这是两部分,如果我在任何地方重复,我很抱歉。我读到了我遇到的两个错误的相关主题。

我写了一个与无线控制器的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/\(.*\),.*/\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

输入文件是CSV文件。每一行的格式应为&#34; name,MAC&#34;。以下是我用于测试的文件的内容。

  

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

     保罗史密斯,AB:CD:EF:12:33:44

我把它递给了顾客,这就是他们得到的。

  

$ bash mac-add.bsh

     

:找不到命令:

     

:找不到命令:

     

输入IP:编辑

     

&#39;:不是有效的标识符:`ipAddr

     

mac-add.bsh:第7行:条件表达式中的语法错误:意外令牌`(&#39;

     

mac-add.bsh:第7行:`^([&#39;

]附近的语法错误      

&#39; ac-add.bsh:第7行:`if [[$ ipAddr =〜^([0-9] {1,3}。){3} [0-9] {1,3 } $]];然后{

     

上次返回状态:2

所以我想也许他们没有支持正则表达式的bash版本。他们说他们正在运行4.1.3,我认为应该这样做。我不完全确定Linux有什么味道,但实际上我只是想知道这有什么问题所以我可以开展可移植性工作。如果需要,我也愿意使用其他语言。

我最初的想法是通过删除LOG和cOpt简化脚本,后者是因为我只是用它来使cURL调用一行。我也会删除正则表达式检查。

1 个答案:

答案 0 :(得分:1)

检查你的行结尾。

如果shell脚本具有Windows样式的行结尾,则foo之类的行将显示为foo^M;当它打印错误消息foo^M: Command not found时,^M会将光标移动到行的开头,其余的消息将覆盖命令名称。 (这里我使用^M来表示回车符。)

你可以运行

bash mac-add.bsh 2>&1 | cat -A

查看包含返回字符的错误消息(如果cat -v没有cat选项,则显示-A

根据您的描述,您可能已经在您和客户之间添加了Windows样式的行结尾。