1

请告诉我下面的 UNIX 代码有什么问题。

#!/bin/ksh

 p=10
 for i in $p
 do
  echo $i
 done

我期待输出为

1
2
3
.
.
.

但得到的输出只有 10 我需要 for 循环而不是 while 循环。

4

3 回答 3

3

ksh

#!/bin/ksh
p=10
i=1
while ((i<=p)); do
  echo $i
  i=$((i+1))
  done

或者

#!/bin/ksh
# with for you can only do this
for i in 1 2 3 4 5 6 7 8 9 10; do
  echo $i
  done

bash它按预期工作

#!/bin/bash
p=10
for (( i=1; i<=p; i++ )); do 
  echo $i
  done

有一个 Linux 命令seq可用于kshbash。但它是一个Linux命令。所以这在Solaris或其他没有安装 progrtam seq的 Unix 系统上不起作用。

# on Linux, bash or ksh
p=10
for i in $(seq $p); do 
  echo $i
  done

以下仅使用 shell 内置程序,因此适用于所有 bash 安装(例如,在 Solaris 上),但不适用于 ksh

#!/bin/bash
p=10
for i in `eval echo {1..$p}`; do 
  echo $i
  done

这个复杂的结构是必要的,因为大括号扩展发生在变量扩展之前

于 2013-10-21T08:51:52.527 回答
1

您必须指定一个范围。否则循环无法工作。这应该这样做:

#!/bin/ksh

 p=10
 for i in {0..$p}
 do
  echo $i
 done

@fedorqui:你说得对,我完全错过了。当我在 Bash 中做这样的事情时(我不知道 KornShell 是否一样),我会这样:

for ((i=0; i<$p; i++))
于 2013-10-21T08:51:35.227 回答
0

在 UNIX 中

#!/bin/ksh

while [ ${i:=1} -le 10 ]
 do
  echo "$i"
  let i+=1
 done
于 2013-10-28T16:09:59.657 回答