Shell尝试使用cut和echo命令后出错

时间:2017-01-28 17:14:45

标签: bash shell loops for-loop cut

美好的一天。

尝试制作一个逐行读取文件的脚本,并获取由“;”分隔的所述行的第6个字段我收到以下消息:

$MID = time() .'-' . md5('xxx@gmail.com' . 'yyy@gmail.com') . '@domain.com';
$mail->MessageID = $MID;

files.txt行如下所示

/directory/file.txt: line 1: syntax error near unexpected token `;;'
/directory/file.txt: line 1: `name;123456789;middlename;01/01/2017;9876543210;555555555555;product;;;'

最后一个“;”是因为文本文件是从excel文件复制的,后来转换为dos2unix的unix格式。当我从脚本中使用cut命令时,我得到了我想要的东西,但是如果我在下面的循环中使用它,我会收到错误消息:

name;123456789;middlename;01/01/2017;9876543210;555555555555;product;;;

为什么会发生这种情况,我该如何解决?

1 个答案:

答案 0 :(得分:2)

有效地解决代码的一切都是错误的。

  1. 作业声明不会在=
  2. 的任何一侧占用空格
  3. for无法打开文件并对其内容进行迭代
  4. 使用$运算符扩展参数;否则,它们只是文字字符串。
  5. 一个简单的工作示例:

    file="/directory/file.txt"
    while IFS= read -r line; do
        printf '%s' "$line" | cut -d";" -f6
    done < "$file"
    

    正确使用while循环后,您可以使用read命令为您进行字段分割;不需要cut

    while IFS=";" read -r f1 f2 f3 f4 f5 f6 frest; do
        echo "$f6"
    done < "$file"
    

    使用数组可以缩短它,但会使您的代码不符合POSIX。

    while IFS=";" read -ra f; do
        echo "${f[5]}"
    done < "$file"