美好的一天。
我正在尝试创建一个脚本来读取特定文件的每一行,然后根据该行包含的字符数将每行发送到第二个文件。
例如,我有一个名为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
答案 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