分页: 1 / 1

bash的bug?

发表于 : 2011-03-10 22:12
fnan

代码: 全选

#!/bin/bash

#echo -n '输入要创建的文本名:'
#read v_file_name
echo -n '输入需要的行数:'
read v_number_line
for i in $(seq $v_number_line);do
	for ia in $(seq 80);do
		a=$(($RANDOM%92+35))
		if [[ $a -lt 40  ]];then #  允许 * + , 字符。
			a=" "
		else
			a=$(echo "obase=8;$a" |bc)
			a='\'0$a
			a=$(echo -e "$a")
		fi
		c=$c$a
	done
echo -n "$i> 字节数: "
echo ${#c}
echo $c
c=
done
会有无法解释的现象:
124> 字节数: 80
Qx;U@wiD^V oFeZ|p6mt>Zc{hLuy1dr[s-(TZPM]Ttx23g`><</K<Ac25O+IS;K{aR^*M:l hjgH2s=x
125> 字节数: 80
Lr@wz`I0XU }EC/JLosmbW{4^eeB- I{Ju,V]tWGhKVO:Wg1c9 gWU ys~~f,<~|32MOZ)M+1dRAvDm9
126> 字节数: 80
[q,R0V-J0 0010_01_00000091_1100_0_2010_03_07_06_06_58_new.txt 0010_01_00000091_1100_1_2010_03_07_09_06_58_new.txt 0010_01_00000091_1100_1_2010_03_07_10_06_58_new.txt 1.txt abs.txt cj随机词文本.sh Desktop Documents Downloads examples.desktop hello hello2 hello2.c hello3 hello3.c hello.c iedict.iso me Music mye n Pictures pr.sh Public r2 rb.sh rs.sh shell字体颜色 Templates Videos VirtualBox VMs 安装postgresql iiz9]a\4p6ZA4^B}zo`P)p0Hy6zi>>q-EPCRT3,CRv C{Rp 1k_e.|n=yNS5F5.HNv(v
127> 字节数: 80
I Im_mMZ?>]8>}/uY[=fzg<zo*P<RuYr|ESSxac~y0?2RVQ-QBfeFmrKb xZ+}BM_O~aOsuP-w`jK;X`
128> 字节数: 80
N{ 0i1oKZgn1|Ee ^PQ (U@iIAuKp122VzhYm*BDJ i5Z5P )3f1z~vq7AH+iB[}4u9PJ{zA<o]l^mGR

***************注意第 126 行*************** 发疯了!****************************

如果把这句代码 if [[ $a -lt 40 ]];then # 允许 * + , 字符。
改为 if [[ $a -lt 40 || ($a -gt 41 && $a -lt 44) ]];then # 即不允许 * + , 字符。
输出就会正常!

非常严重,因为代码完全没有错误, 查疯了也找不到毛病。

Re: bash的bug?

发表于 : 2011-03-10 22:26
BigSnake.NET
不小心输出了控制字符了吧 =。=

Re: bash的bug?

发表于 : 2011-03-10 23:30
fnan
BigSnake.NET 写了:不小心输出了控制字符了吧 =。=
哪为何禁止* + ,三个字符就无事?

Re: bash的bug?

发表于 : 2011-03-10 23:34
fnan
那些乱输出的显然是/dev/random里的随机源,如何连到哪里去了?

把 c=$c$a 改成 c=$c-$a 可以看到正确的字符输出, 证明问题在最后的echo 上,与$RANDOM无关。

Re: bash的bug?

发表于 : 2011-03-11 5:26
fnan
借用awk的print输出,看到有特殊字符,但不会发疯, 用awk好了。

代码: 全选

#!/bin/bash

echo -n '输入要创建的文本名:'
read v_file_name
echo -n '输入需要的行数:'
read v_number_line
for i in $(seq $v_number_line);do
	for ia in $(seq 80);do
		a=$(($RANDOM%92+35))
		if [[ $a -lt 40 ]];then
			a=" "
		else
			a=$(echo "obase=8;$a" |bc)
			a='\'0$a
			a=$(echo -e "$a")
		fi
		c=$c$a
	done
echo -n "$i> 字节数: "
echo ${#c}
cat /dev/null |awk 'END{print e}' e="$c" >> $v_file_name
c=
done

Re: bash的bug?

发表于 : 2011-03-11 22:08
fanhe
不知道楼主目的是啥
变量全部用双引号引上试试

Re: bash的bug?

发表于 : 2011-03-12 0:11
fnan
fanhe 写了:不知道楼主目的是啥
变量全部用双引号引上试试
试过了, 一律无效。
(有时需要超大随机字符文件测试命令效率,比如十万行的, 不成自己一行一行写?)

Re: bash的bug?

发表于 : 2011-03-14 12:46
lilydjwg
fnan 写了:
BigSnake.NET 写了:不小心输出了控制字符了吧 =。=
哪为何禁止* + ,三个字符就无事?
* 被扩展了?

Re: bash的bug?

发表于 : 2011-03-14 12:47
lilydjwg
fnan 写了: (有时需要超大随机字符文件测试命令效率,比如十万行的, 不成自己一行一行写?)

代码: 全选

head -n100000 /dev/urandom > randomfile

Re: bash的bug?

发表于 : 2011-03-14 20:26
fnan
head -n100000 /dev/urandom > randomfile
不行,长度要有限制, 要有空格, 不能有带问号的和带四个小格的特殊字符

Re: bash的bug?

发表于 : 2011-03-14 22:04
lilydjwg
fnan 写了:
head -n100000 /dev/urandom > randomfile
不行,长度要有限制, 要有空格, 不能有带问号的和带四个小格的特殊字符
带四个小格的特殊字符 是什么?

Re: bash的bug?

发表于 : 2011-03-14 23:06
fnan
带四个小格的特殊字符 是什么?
��v��֘�t�Nf�

Re: bash的bug?

发表于 : 2011-03-14 23:09
lilydjwg
fnan 写了:
带四个小格的特殊字符 是什么?
��v��֘�t�Nf�
这个是无效的编码啦。。

话说,你为什么不用 Python/Perl/Ruby/etc 弄呢?这些语言比 shell 好弄得多。

Re: bash的bug?

发表于 : 2011-03-15 2:03
fnan
折腾bash时间,不管别的。