尝试执行IF语句时出现Shell错误

时间:2016-12-27 16:06:42

标签: shell

美好的一天。

我正在尝试创建一个脚本来读取特定文件的每一行,然后根据该行包含的字符数将每行发送到第二个文件。

例如,我有一个名为numbers的文件,其中包含以下信息:

numbers.txt

5196803638
31995500317
5196396080
51999205240
5198158891

正如你所看到的,每个号码上都有8或9个号码,我试图创建一个读取文件行的​​脚本并将每个号码发送到其特定文件。

!#/bin/bash

while IFS='' read -r line || [[ -n "$line" ]]; do

    echo $line

if [ "${#line}"= 8 ]; then
    $line> file8.txt
elif [ "${#line}"= 9 ]; then
    $line> file9.txt
else
    echo "Error"
fi

done < "$1"

但我唯一得到的是以下

51996803638
My.sh: line 7: [: 11=: unary operator expected
My.sh: line 9: [: 11=: unary operator expected
Error

2 个答案:

答案 0 :(得分:2)

您的号码有10个或11个字符。比较数值时,请使用-eq-ne-lt-gt-le-ge

while IFS='' read -r line || [[ -n "$line" ]]; do
    echo $line
    echo "Length = ${#line}"
    if [ ${#line} -eq 10 ]; then
        echo $line >> file10.txt
    elif [ ${#line} -eq 11 ]; then
        echo $line >> file11.txt
    else
        echo "Error"
    fi
done < "$1"

答案 1 :(得分:1)

shell的标记生成器对空白区域敏感。使用=周围的空格,如

if [ "${#line}" = 8 ]; then
    $line> file8.txt
elif [ "${#line}" = 9 ]; then
    $line> file9.txt
else
    echo "Error"
fi

或者,我发现它更具可读性/可维护性/可扩展性:

case ${#line} in
  (8) $line > file8.txt;;
  (9) $line > file9.txt;;
  (*) echo Error;;
esac