在 bash for 循环中使用命令行参数范围打印包含参数的括号

Posted

技术标签:

【中文标题】在 bash for 循环中使用命令行参数范围打印包含参数的括号【英文标题】:Using command line argument range in bash for loop prints brackets containing the arguments 【发布时间】:2011-08-07 03:50:08 【问题描述】:

这可能是一个蹩脚的问题。但是我从命令行 [ bash script ] 获得了 3 个参数。然后我尝试在 for 循环中使用这些。

for i in $1..$2
    do action1
done

这似乎不起作用,如果 $1"0" 并且 $22 它只打印一次 0..2' and callsaction1`。我提到了各种例子,这似乎是正确的用法。有人可以告诉我这里需要修复什么吗?

提前致谢。

【问题讨论】:

【参考方案1】:

您可以使用$@:3$@:3:8 对输入进行切片,然后对其进行循环

例如,打印从 3 开始的参数

for i in $@:3 ; do echo $i; done

或打印从 3 开始的 8 个参数(因此,参数 3 到 10)

for i in $@:3:8 ; do echo $i; done

【讨论】:

【参考方案2】:

怎么样:

for i in $(eval echo $1..$2); do echo $i; done

【讨论】:

我建议不要使用 eval 并考虑按照 Vijayender 的回答中的建议拼接参数。【参考方案3】:

使用 $@ 变量?

for i in $@
do
    echo $i
done

如果您只想使用第一个和第二个参数,只需

for i in $1 $2 

如果您的 $1 和 $2 是整数并且您想创建一个范围,请使用 C for 循环语法 (bash)

for ((i=$1;i<=$2;i++))
do
...
done

【讨论】:

您可能只想包含答案的第二部分 - 这比使用 eval 更好并且适合问题。【参考方案4】:

我遇到了类似的问题。我认为问题在于在大括号“”中取消引用 $1。以下替代方案对我有用..

#!/bin/bash
for ((i=$1;i<=$2;i++))
do
   ...
done

希望对您有所帮助。

【讨论】:

+1 IMO 这比在接受的答案中必须eval 更干净,但接受的答案更具体到 OP【参考方案5】:
#/bin/bash
for i
do
  echo Value: $i
done

这将遍历给脚本文件的所有参数。请注意,循环变量 i 之后没有“do”或其他任何内容。

【讨论】:

【参考方案6】:
for i in `seq $1 $2`; do echo $i; done

【讨论】:

【参考方案7】:

我推荐这个: 在循环中,我们只处理 $1,并移位 N 次(如果接下来需要参数,那么最好保存它,因为移位删除参数):

for a in 1 2 3
do
echo $1
shift
done

示例:./test.sh "abra k" "b 2" "c 14"

abra k
b 2
c 14

【讨论】:

以上是关于在 bash for 循环中使用命令行参数范围打印包含参数的括号的主要内容,如果未能解决你的问题,请参考以下文章

[Linux Shell学习系列七]Bash循环——1for循环

如何在bash shell中执行for循环生成的curl命令?

Windows批处理FOR循环通过命令行的范围

Bash不会在for循环中打印带问号的字符串

bash:for 循环与位置参数( $*$@)

使用bash脚本,编写一个实现将命令行的多个参数逆序输出的程序。