shell脚本中的命令行参数

时间:2014-12-16 09:39:02

标签: shell command-line-arguments

以下是shell脚本,它迭代命令行参数并打印值

for var in "$@"
do
    echo $var
done

现在,如果我想从第二个命令行参数(第一个用于其他目的的参数)进行迭代,那么在迭代中单独排除第一个参数的命令是什么?

3 个答案:

答案 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