【发布时间】:2014-12-16 09:39:01
【问题描述】:
以下是迭代命令行参数并打印值的 shell 脚本
for var in "$@"
do
echo $var
done
现在,如果我想从第二个命令行参数(第一个参数用于其他目的)进行迭代,那么在迭代中单独排除第一个参数的命令是什么?
【问题讨论】:
标签: shell command-line-arguments
以下是迭代命令行参数并打印值的 shell 脚本
for var in "$@"
do
echo $var
done
现在,如果我想从第二个命令行参数(第一个参数用于其他目的)进行迭代,那么在迭代中单独排除第一个参数的命令是什么?
【问题讨论】:
标签: shell command-line-arguments
使用shift:
#!/usr/bin/env bash
shift
for var in "$@"; do
echo "$var"
done
【讨论】:
第一个参数在$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:
移位 [n]
位置参数 n+1 ... 重命名为 $1 .... 参数 由数字 $# 到 $#-n+1 表示的未设置。 n 必须是小于或等于 $# 的非负数。如果 n 为 0,则不更改任何参数。如果 n 没有给出,则假定为 1。如果 n 大于 $#,则位置参数 没有改变。如果 n 为,则返回状态大于零 大于 $# 或小于零;否则为 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
【讨论】: