Bash阵列打印,但一次只有23行。

时间:2014-11-13 10:24:26

标签: bash

好的,我试图遵守项目的某些标准。我一次只允许打印出23行。我已将目录的文件提供给数组,并知道如何将其打印出来。

        LIST=(`ls`)
        len=${#LIST[*]}
        i=0
        while [ $i -lt $len ]; do
        echo "$i: ${LIST[$i]}"
        let i++
        done

我试图只允许它一次打印出23个项目,然后要求用户输入继续,

         read -n1 -rsp $'Press any key to continue \n'

然后用户将键入他们想要使用的文件的编号。

有什么想法吗?

4 个答案:

答案 0 :(得分:3)

看起来像这样:

LIST=(`ls`)
len=${#LIST[*]}
i=1
while [ $i -lt $len ]
do
  echo "$i: ${LIST[$i]}"
  if [ `expr $i % 23` == 0 ]
  then
    read -n1 -rsp $'Press any key to continue \n'
  fi
  let i++
done

即。你的条件是:

if [ `expr $i % 23` == 0 ]
then
    . . . 
fi

另请注意i=1因为0 % N总是给出零

答案 1 :(得分:2)

您可以使用此BASH脚本:

n=22
arr=(*)
for ((i=0; i<=${#arr[@]}; i+=n)); do
   echo "${arr[@]:$i:$n}"
   read -n1 -p 'Press any key to continue...'
done

答案 2 :(得分:0)

将其拆分为双循环。

另请注意,请勿在脚本中使用ls

LIST=( * )
len="${#LIST[@]}"
for((i=0; i<$len; i+=23)); do
    [[ $i > 1 ]] && read -n1 -rsp $'Press any key to continue \n'
    for((j=0, k=i; j<23 && k<$len; ++j, ++k)); do
        echo "[$i + $j] $k: ${LIST[$k]}"
    done
done

答案 3 :(得分:0)

可以使用printf命令代替循环。

tmp=( "${LINES[@]}" )
start=1
while (( ${#tmp[@]} -gt 0 )); do
    printf "%s\n" "${tmp[@]:0:23}" | nl -v $start
    tmp=( "${tmp[@]:23}" )
    ((start+=23))
    read -n1 -rsp $'Press any key to continue \n' 
done

tmp用于避免不必要地销毁LINESprintf以及tmp上的子字符串扩展运算符用于一次打印23行,通过管道传输 nl用于编号。 start变量可用于连续对行进行编号,而不是将每个批次打印为1-23行。