Macos 对脚本参数中给定的每个第n个文件执行操作
我想启动一个bash脚本,使用一些文件作为参数。然后,我需要将该列表的第n个文件添加到一个数组中Macos 对脚本参数中给定的每个第n个文件执行操作,macos,bash,for-loop,Macos,Bash,For Loop,我想启动一个bash脚本,使用一些文件作为参数。然后,我需要将该列表的第n个文件添加到一个数组中 它曾考虑使用for循环,但似乎它只能同时执行这两件事情中的一件。当然,我希望生成的代码尽可能简单和小,但唯一的先决条件是必须在bash中完成,并且只能使用系统附带的工具。我认为for循环非常合适。这里,对于n=9,我创建了一个包含数字0到99的数组,然后使用for循环创建了一个包含原始数组中每9位数字的数组: x=( {0..99} ) y=() n=9 for ((i=0; i<${#x[@
它曾考虑使用
for
循环,但似乎它只能同时执行这两件事情中的一件。当然,我希望生成的代码尽可能简单和小,但唯一的先决条件是必须在bash中完成,并且只能使用系统附带的工具。我认为for
循环非常合适。这里,对于n=9
,我创建了一个包含数字0到99的数组,然后使用for循环创建了一个包含原始数组中每9位数字的数组:
x=( {0..99} )
y=()
n=9
for ((i=0; i<${#x[@]}; i=i+n)); do
y+=( "${x[i]}" )
done
x=({0..99})
y=()
n=9
对于((i=0;i由于文件名是参数,您可以使用shift
放弃不需要的参数:
#!/bin/bash
files=()
n=8
while (( $# > 0 )); done
files+=( $1 )
shift $n || shift $#
done
额外的shift
是必要的,因为shift
如果其参数大于剩余参数的数量,则不会执行任何操作。您可以使用间接变量引用以数字方式引用参数:
selectedargs=()
n=4
for ((i=1; i<$#; i+=n)); do
selectedargs+=("${!i}")
done
selectedargs=()
n=4
对于((i=1;i您是在循环之前创建一个数组并对该数组执行操作。我想添加到以空数组开头的数组中,但我不知道它将有多少字段。我需要运行my_script file1 file2 file2
,并让它对它们执行操作(可能使用$@
)然后每N次执行一次。@user137369什么阻止了你?你可以用“$@”
代替“${x[@]}”
在我的循环中,它仍然会作用于它的每一个第n个。被选为新的最佳答案,因为for循环看起来更干净,更容易维护。然而,我有一个问题。它是有效的,我可以理解它的大部分,除了!
在这种情况下到底做了什么?@user137369:!
告诉bash来执行——本质上,它用它的值替换变量名,然后将其视为另一个变量名并用它的值替换。因此,例如,当i=12时,它将“${!i}”
转换为“${12}”
,然后转换为脚本的第12个参数。