以下是shell脚本,它迭代命令行参数并打印值
for var in "$@"
do
echo $var
done
现在,如果我想从第二个命令行参数(第一个用于其他目的的参数)进行迭代,那么在迭代中单独排除第一个参数的命令是什么?
答案 0 :(得分:1)
第一个参数位于$1
,所以正在执行
var1=$1
会将其存储到var1
然后,您可以使用shift
“删除”第一个arg并仍使用for循环:
~$cat s.sh
var1=$1
shift
echo var1=$var1
for var in "$@"
do
echo $var
done
~$ ./s.sh 1 2 3
var1=1
2
3
来自man bash
:
shift [n]
来自n + 1 ...的位置参数被重命名为$ 1 ....参数 由数字##down to $# - n + 1表示未设置。 ñ 必须是小于或等于$#的非负数。如果是 为0,没有参数更改。如果没有给出n,则假定为1.如果n大于$#,则为位置参数 没有改变。如果n为,则返回状态大于零 大于$#或小于零;否则为0。
答案 1 :(得分:1)
使用shift
:
#!/usr/bin/env bash
shift
for var in "$@"; do
echo "$var"
done
答案 2 :(得分:0)
此示例的行为更像是标准的unix命令行实用程序。选项按任何顺序处理,并且可以包含修饰符。它不适用于所有情况(例如其中包含空格的修饰符),但我发现它对于我想要具有某些默认行为的脚本非常有用,但偶尔我想修改一个或多个参数。
#!/bin/bash
#defaults
VAR1="Yours"
VAR2="Mine"
VAR3="Ours"
SHARENICE="false"
while [ $# -gt 0 ]; do
case "$1" in
#single parameter
-s) SHARENICE="true"
shift
;;
#modified parameters
-1) VAR1="$2"
shift 2
;;
-2) VAR2="$2"
shift 2
;;
-3) VAR3="$2"
shift 2
;;
#you could put a 'usage' function here,
#or if your last parameter has no modifier,
#like a mandatory input, it will now be at
#$1
*)
break
;;
esac
done
echo -n "$VAR1, $VAR2 and $VAR3. "
if [ "$SHARENICE" != "true" ]; then
echo "Too bad we don't get along."
else
echo "Good thing we play nice!"
fi