如何在bash脚本中循环遍历参数


16

我想编写一个bash脚本,其参数数量未知。

我该如何处理这些论点并对它们做些事情?

错误的尝试如下所示:

#!/bin/bash
for i in $args; do 
    echo $i
done

Answers:


28

有一种特殊的语法:

for i do
  printf '%s\n' "$i"
done

通常,可以通过特殊变量获得当前脚本或函数的参数列表$@

for i in "$@"; do
  printf '%s\n' "$i"
done

请注意,您需要在双引号周围$@,否则参数将进行通配符扩展和字段拆分。"$@"不可思议:尽管有双引号,但它会扩展到与参数一样多的字段。

print_arguments () {
  for i in "$@"; do printf '%s\n' "$i"; done
}
print_arguments 'hello world' '*' 'special  !\characters' '-n' # prints 4 lines
print_arguments ''                                             # prints one empty line
print_arguments                                                # prints nothing

5
#! /usr/bin/env bash
for f in "$@"; do
  echo "$f"
done

您应该使用引号,$@因为如果引号将参数包含空格(或换行符等),或者用进行转义,则可能会包含空格\。例如:

./myscript one 'two three'

由于引号,这是两个参数,而不是三个。如果您不引用$@,则这些参数将在脚本内分解。


2
这有一个简写形式for f; do ...
glenn jackman
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.