Bash数组打印,但一次只能打印23行。

Bash数组打印,但一次只能打印23行。,bash,Bash,好的,我正试图符合一个项目的一些标准。我一次只能打印23行。我已经将一个目录的文件输入到一个数组中,并且知道如何将其打印出来 LIST=(`ls`) len=${#LIST[*]} i=0 while [ $i -lt $len ]; do echo "$i: ${LIST[$i]}" let i++ done 我试图只允许它一次打印23个项目,然后请求用户输入继续

好的,我正试图符合一个项目的一些标准。我一次只能打印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'
然后用户将键入他们要使用的文件的编号

有什么想法吗?

看起来是这样的:

LIST=(`ls`)
len=${#LIST[*]}
i=1
而[$i-lt$len]
做
回显“$i:${LIST[$i]}”
如果[`expr$i%23`==0]
然后
读取-n1-rsp$'按任意键继续\n'
fi
让我++
完成
i、 e.你的条件是:

if[`expr$i%23`==0]
然后
. . . 
fi
另请注意,
i=1
原因
0%N
始终为零

如下所示:

LIST=(`ls`)
len=${#LIST[*]}
i=1
而[$i-lt$len]
做
回显“$i:${LIST[$i]}”
如果[`expr$i%23`==0]
然后
读取-n1-rsp$'按任意键继续\n'
fi
让我++
完成
i、 e.你的条件是:

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

另请注意,
i=1
原因
0%N
始终为零

您可以使用此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
n=22
arr=(*)

对于((i=0;i),可以使用以下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
n=22
arr=(*)

对于((i=0;i只需将其拆分为双循环

还要注意,不要在脚本中使用
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
LIST=(*)
len=“${#LIST[@]}”
对于((i=0;i 1]]&&read-n1-rsp$'按任意键继续\n'

对于((j=0,k=i;j只需将其拆分为双循环

还要注意,不要在脚本中使用
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
LIST=(*)
len=“${#LIST[@]}”
对于((i=0;i 1]]&&read-n1-rsp$'按任意键继续\n'

对于((j=0,k=i;j),此处可以使用
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
用于避免不必要地破坏
printf
以及
tmp
上的子字符串扩展操作符用于通过管道一次打印23行
用于编号的
nl
start
变量可用于连续对行进行编号,而不是将每批打印为第1-23行。

此处可使用
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
用于避免不必要地破坏
printf
以及
tmp
上的子字符串扩展操作符用于通过管道一次打印23行
nl
用于编号。可以使用
start
变量连续对行进行编号,而不是将每批打印为第1-23行。

这太漂亮了,我甚至从未想过将其暂停为23次。谢谢!我正在搜索,如果[`expr($I+1))有什么方法可以做到吗%23`==0}若要说明从0开始的数组,请在使用
expr
时,在图形之间放置空格(是的,它们是参数),在您的情况下,它将是
expr\($i+1\)%23
再次感谢您,我想可能是这样的,但在谷歌上搜索示例时遇到了困难
expr
对于
bash
(或任何POSIX外壳)中的算术是不需要的。
if[$((i%23))-eq 0]
以实现完全的POSIX兼容性,或者只是
if((i%23==0))
bash
中。这太漂亮了,我从来没有想过要暂停23次。谢谢!我现在正在搜索,如果[`expr($I+1)%23`==0}来解释从0开始的数组,有什么方法吗?当使用
expr
时,在数组之间放置空格(是的,它们是参数),对于你来说应该是
expr\($i+1\)%23再次感谢您,我想可能是这样,但在谷歌上搜索示例时遇到了困难
expr
对于
bash
(或任何POSIX外壳)中的算术都不需要。
如果[$((i%23))-eq 0]
实现完全的POSIX兼容性,或者只是
if((i%23==0))
bash
中。您需要使用数组吗?不要像这样使用
ls
LIST=(*)
。您需要使用数组吗?不要像这样使用
ls
LIST=(*)