好的,我试图遵守项目的某些标准。我一次只允许打印出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'
然后用户将键入他们想要使用的文件的编号。
有什么想法吗?
答案 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
用于避免不必要地销毁LINES
。 printf
以及tmp
上的子字符串扩展运算符用于一次打印23行,通过管道传输
nl
用于编号。 start
变量可用于连续对行进行编号,而不是将每个批次打印为1-23行。