如何限制shell脚本中for循环的迭代次数

如何限制shell脚本中for循环的迭代次数,shell,Shell,我正在编写一个shell脚本,从数据库中获取数据,并根据用户提供的输入返回结果 但是,我想限制用户最多传递一个特定数字(例如10个)的逗号分隔值。即使用户传递了10个以上的值,我的shell脚本也应该限制该用户,并且只执行用户提供的列表中的10个 我能够获取所有用户提供的值的结果,但无法确定如何将相同的值限制为特定的数字 我的Shell脚本 预期结果 I除了shell脚本之外,我只通过忽略rest获取前10个逗号分隔的值(在上面的例子中,脚本需要选择值,直到从“a1”到“j10”并忽略rest)

我正在编写一个shell脚本,从数据库中获取数据,并根据用户提供的输入返回结果

但是,我想限制用户最多传递一个特定数字(例如10个)的逗号分隔值。即使用户传递了10个以上的值,我的shell脚本也应该限制该用户,并且只执行用户提供的列表中的10个

我能够获取所有用户提供的值的结果,但无法确定如何将相同的值限制为特定的数字

我的Shell脚本 预期结果 I除了shell脚本之外,我只通过忽略rest获取前10个逗号分隔的值(在上面的例子中,脚本需要选择值,直到从“a1”到“j10”并忽略rest),并对DB执行相同的操作


任何帮助都将不胜感激。提前谢谢

如果将ID读入数组,则可以使用参数展开仅获取该数组的前10个元素,如下所示:

#!/usr/bin/env bash
#              ^^^^- NOT /bin/sh; arrays require a shell with ksh extensions.

IDs=a1,b2,c3,d4,e5,f6,g7,h8,i9,j10,k11,l12,m13,n14  # original input
IFS=, read -r -a id_arr <<<"$IDs"                   # transform into an array
max_count=10                                        # input w/ count to process

for i in "${id_arr[@]:0:max_count}"; do             # iterate only over that many
  echo "Fetching results for $i by running sql against DB"
done
#/usr/bin/env bash
#^^^^-非/bin/sh;阵列需要具有ksh扩展的shell。
IDs=a1、b2、c3、d4、e5、f6、g7、h8、i9、j10、k11、l12、m13、n14#原始输入

如果s=,read-r-a id_arr有很多方法可以对这个进行切分

这里有一个选项需要对OPs当前代码进行少量添加(
cut
),以限制处理的项目数:

$ IDs=a1,b2,c3,d4,e5,f6,g7,h8,i9,j10,k11,l12,m13,n14

$ echo ${IDs} | cut -d"," -f1-10
a1,b2,c3,d4,e5,f6,g7,h8,i9,j10

$ for i in $(echo ${IDs} | cut -d"," -f1-10 | sed 's/,/ /g')
do
    echo "Fetching results for $i by running sql against DB"
done

Fetching results for a1 by running sql against DB
Fetching results for b2 by running sql against DB
Fetching results for c3 by running sql against DB
Fetching results for d4 by running sql against DB
Fetching results for e5 by running sql against DB
Fetching results for f6 by running sql against DB
Fetching results for g7 by running sql against DB
Fetching results for h8 by running sql against DB
Fetching results for i9 by running sql against DB
Fetching results for j10 by running sql against DB

对于i(任何东西)
都是不好的做法;看见也是密切相关的——大部分应用于一般的字符串输入,而不仅仅是面向行的内容。。。还有很多(好的和坏的)切分问题的方法请注意,您可以在开始循环之前设置
counter=0
,将
counter=$((counter+1))
放入循环中,然后
[“$counter”-gt 10]&&break
或在适当的时间退出循环。(与我提供的正式答案不同,以上内容都适用于基线POSIX shell)。此外,如果您在脚本的前面设置了
IFS=,
,那么,
for I in$IDs
将在逗号上拆分(尽管它还有其他bug,除非您关闭globbing)。
$ IDs=a1,b2,c3,d4,e5,f6,g7,h8,i9,j10,k11,l12,m13,n14

$ echo ${IDs} | cut -d"," -f1-10
a1,b2,c3,d4,e5,f6,g7,h8,i9,j10

$ for i in $(echo ${IDs} | cut -d"," -f1-10 | sed 's/,/ /g')
do
    echo "Fetching results for $i by running sql against DB"
done

Fetching results for a1 by running sql against DB
Fetching results for b2 by running sql against DB
Fetching results for c3 by running sql against DB
Fetching results for d4 by running sql against DB
Fetching results for e5 by running sql against DB
Fetching results for f6 by running sql against DB
Fetching results for g7 by running sql against DB
Fetching results for h8 by running sql against DB
Fetching results for i9 by running sql against DB
Fetching results for j10 by running sql against DB