未找到命令并且在意外标记附近存在语法错误

未找到命令并且在意外标记附近存在语法错误

我有这个脚本可以将文件划分为 100000 行甚至更多,分为 50000 行。

desc()                                                 
   {                                                   
   echo $1 $2|awk '{d=$1;}                             
   BEGIN {a=1;b=0}                                     
      { f=d"0"a;                                       
        while ((getline x<d)>0)                        
          { print x>>f".txt"                           
            if (b++>=50000)                            
               {                                       
                 close(f);b=0;a++;f=(a<10)?d"0"a:f=d""a
               }                                       
          }                                            
      }                                                
  END {print "Terminado ... ! "}'                      
  }                                                    

if [ -f $1 ]; then                                     
        desc $1 $2                                     
fi                                                     

当我执行它时,我收到以下错误消息:

sh-3.2$ parte.sh pa.txt                                 
: command not found                                     
'/parte.sh: line 2: syntax error near unexpected token `
'/parte.sh: line 2: `desc()                             
sh-3.2$                                                 

有人可以帮忙解决吗?

答案1

第一条错误消息: command not found不是通常的格式bash: SOMECOMMAND: command not found。这表明有些可疑的事情正在发生。

发生的事情是你的脚本包含回车某些行末尾的字符。在 Windows 下,换行符由两个字符序列 CR、LF(回车符后跟换行符)表示。在所有 Unix 风格下,换行符仅由字符 LF 表示。 Bash 看到像SOMECOMMAND␍were这样的行是一个 CR 字符,它将其解析为对名为 的命令的调用SOMECOMMAND␍。由于没有这样的命令,bash 会显示其通常的错误消息。

在终端中,控制字符 CR 将光标移回行首。因此消息的其余部分将覆盖命令名称。

修复方法是不要使用 Windows 编辑器来编辑 shell 脚本,或者将编辑器配置为不在 shell 脚本中添加 CR 字符。

要将 Linux 或 Cygwin 下的现有文件从 Windows 行结尾转换为 Unix 行结尾,可以使用以下命令。即使原始文件混合了 Windows 和 Unix 行结尾,它也能工作。

sed -i -e 's/\r$//' parte.sh

答案2

使用split(1), 例如split --lines=50000 pa.txt(或设置您自己的前缀)。可能比 bad 快得多awk

DESCRIPTION
   Output  fixed-size  pieces of INPUT to PREFIXaa, PREFIXab, ...; default
   size is 1000 lines, and default PREFIX is `x'.  With no INPUT, or  when
   INPUT is -, read standard input.

答案3

如果这是一个 sh 脚本,则错误似乎出在您的函数定义中。

desc()
{

应该:

function desc {

脚本示例:

#!/bin/bash
function desc {
echo Hi
}
echo Starting
desc
echo Ending

相关内容