Bash环境可以这样。
#!/bin/bash
for ((i=1;i<=100;i++))
do
name[$i]=$i
echo ${name[$i]} #为方便检查,加了打印
done
通用点的(符合POSIX标准)可以这样:
#!/bin/sh
declare -a name
for i in `seq 100`
do
name[$i]=$i
echo ${name[$i]} #为方便检查,加了打印
done
bash手册 arrays章节第一段话的某一句:
数组的大小没有上限,也没有限制在连续对成员引用和赋值时有什么要求。数组以整数为下标,从 0 开始。
使用cat的话可以这样:
cat 123.txt | while read line
do
echo "$line"
done
123.txt的每行读取到变量line中并输出。
都会报错
追答同样是Ubuntu 10.10,不会报错。
书写时请注意空格,关键词for后面要有空格
加了空格一样错
追答我看了你下面的程序,
关键问题在于,你声明为了 #!/bin/sh,而sh环境是不能用 for((i=0; i<100; i++)) 这种不符合POSIX标准的语句的。只能用我的第二种方法。 for ... in ... 这种语句是支持的。或者用while循环,变量在循环中递增。
#!/bin/sh
for i in 1 2 3
do
name[$i]=$i
done
name[1]=1:not found
name[2]=1:not found
name[3]=1:not found
说实话,从没接触过象shell这么渣的语言。一点规范都没
for循环前加上这句试试:
declare -a name
声明name为数组变量
加不加都试过了,都错
追答ubuntu中默认的shell是dash,是不支持数组的。
ls -l /bin/sh 可以看到sh是个指向dash的链接,所以你声明#!/bin/sh其实还是用的dash。
我忘记自己曾经配置过Ubuntu了。如下:
=========================================
怎么能把 dash 去掉而使用默认的 bash?
使用命令:sudo dpkg-reconfigure dash
此命令是对已安装的包进行重新配置,在菜单(dash-bash-sh.png)中选择是否将 sh 链接到 dash (Install dash as /bin/sh?) 选择否即可。具体请到百度文库中搜索“Ubuntu把默认的bash替换成了dash“,里面有一张图片说明。
还有另一种不太好看的办法,请百度搜索“Shell中模拟数组”。
#!/bin/sh
for((i=1;i<=100;i++))
do
name[$i]=$i
done
echo ${name[@]}
Syntax error:Bad for loop variable
难道是我系统问题,ubuntu10.10
应该是你系统的问题,我这边的都是红帽的系统,但是原理上都差不多啊,你换成bash试一下
追问bash和sh都通不过
追答Shell的兼容问题吧。
那你就试试遍历可不可行。
for i in `seq 1 100`
do
name[$i]=$i;
done
echo ${name[@]}
for i in `seq 1 100`
do
name[$i]=$i;
done
name[seq: not found
加不加分号都是这个
我大概知道了 我猜你用的是 `seq 1 100` 是单引号,
其实这个是反引号
是在大键盘1 左边的那个键 ---> ~
就是进入一个子进程,去处理seq 1 100,(就是打印从1 2 3 ... 100),然后 for i in 1 2 3 4 ...
我重新用你说的那个键,在sh和bash下,不管加不加分号,都是:
name[1]=1:not found
(中间省略98行)
name[100]=100:not found
就是tab 上边的那个键
你直接用数组赋值试试: name[1]=1 试试
我用的是你说的那个键,这种简单的赋值没问题,放在循环里面就错。
追答你加一个 -x 做一下追踪,把循环的次数调低,或者先不用seq 直接用 for i in 1 2 3 4
然后在shell终端 用seq 1 10 看看输出什么
#!/bin/sh
for((i=1;i<=100;i++))
do
name[$i]=$i
done
echo ${name[@]}
Syntax error:Bad for loop variable
难道是我系统问题,ubuntu10.10
#!/bin/sh
改成
#!/bin/bash
试试看
估计是你的shell不是bash,我写的这个是bash的语法