因此,我想打印满足某些条件的脚本的参数:
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