在 Bash 中打印 for 循环的参数

在 Bash 中打印 for 循环的参数

因此,我想打印满足某些条件的脚本的参数:

t1=0

for i in $@; do


if [ $i == "-1" ] || [ $i == "-2" ] || [ $i == "-3" ]; then

t2=$(($t1+2))

echo $i $"$t2"

fi

t1=$(($t1+1))

done

如果我像这样调用脚本:

./name_of_script  -2 aaa -m bbb -3 ccc -4 ccc -1 ddd

我希望它打印出这样的内容:

-2 aaa
-3 ccc
-1 ddd

所以我想打印参数 -1 , -2 或 -3 ,以及紧随其后的每个参数。但我得到的却是这个:

-2 2
-3 6
-1 10

我就是无法将 2、6 和 10 变成 $2、$6 和 $10,这样我就可以打印脚本的这些参数。

有什么想法吗?非常感谢。

答案1

做这样的事情的可移植(虽然危险)的方法是通过使用eval

eval echo "$i \$$t2"

在 bash 中,有一种更干净、更安全的方法,使用名为变量间接引用

   If  the  first  character of parameter is an exclamation point (!), and
   parameter is not a nameref, it introduces a level of variable  indirec‐
   tion.   Bash  uses  the  value  of the variable formed from the rest of
   parameter as the name of the variable; this variable is  then  expanded
   and that value is used in the rest of the substitution, rather than the
   value of parameter itself.  This is known as  indirect  expansion.

所以你的情况是

echo "$i ${!t2}"

然而,在 shell 脚本中获取下一个位置参数的规范方法是使用shift内置命令。例如,你可以这样做

#!/bin/bash

while [ $# -gt 0 ]; do
  opt="$1"
  case $opt in
    -1|-2|-3)
      shift
      printf '%s %s\n' "$opt" "$1"
    ;;
    *)
      printf 'unknown option: %s\n' "$opt" >2 
    ;;
  esac
  shift
done

尽管如此,你似乎在这里正在做的是重新发明getopts内置功能:

#!/bin/bash

while getopts ":1:2:3:4:m:" opt; do
  case $opt in
    1|2|3)
      printf -- '-%s %s\n' "$opt" "$OPTARG"
    ;;
    *)
      printf -- 'unknown option: -%s\n' "$opt" >2 
    ;;
  esac
done

然后

$ ./name_of_script -2 aaa -m bbb -3 ccc -4 ccc -1 ddd
-2 aaa
-3 ccc
-1 ddd

相关内容