如何将前几个命令行参数存储到数组中

时间:2018-04-22 08:49:26

标签: linux bash shell

我有一个shell脚本,它从命令行获取输入参数。以下只有两个选项:

./test.sh 20180415 20180416 20180417 20180418 2
./test.sh 20180418 2

第一个选项需要5个输入参数,其中前四个是日期格式" YYYYMMDD"我想将这些日期存储在数组变量sets_date=("$@")中,最后一个参数2我将它存储在不同的变量中。

第二个选项需要2个输入参数,其中第一个参数采用相同的日期格式,我仍然希望将该日期存储在数组变量中,将最后一个参数存储在不同的变量中。 这是我将拥有的两个选项。

#!/bin/bash

sets_date=("$@")
# store number in variable

这可以在shell脚本中执行吗?所以我的shell脚本需要5个输入参数或者只有2个输入参数,并且不会有任何其他组合。

2 个答案:

答案 0 :(得分:4)

您可以使用数组扩展技术来执行此操作。首先,您只需要存储从最后一个元素开始的元素。第一种技术的语法很简单,${@:startpos:endpos}。我们将起始位置设置为1,因为0表示正在使用的实际脚本的名称。最终位置是通过从$#减少一个来得出的,exceptLastElem=( "${@:1:$#-1}" ) 表示传递的总位置参数的数量。

lastElement="${@:$#}"

和最后一个元素

ap() { echo "except last ${@:1:$#-1}" ; echo "last ${@:$#}" ; }

将此功能置于虚拟功能

ap 1 2 3 4
except last 1 2 3
last 4

现在使用多个参数调用该函数

{{1}}

答案 1 :(得分:2)

阅读一些,如果额外参数首先是无关紧要的。一个选项 - 像你一样读取列表中的所有内容,然后弹出最后一个元素

sets_date=($@)
extra=${sets_date[((${#sets_date[*]}-1))]}
unset 'sets_date[${#sets_date[@]}-1]'

删除最后一个元素来自Remove the last element from an array。然后验证:

if [ $# != 2 ] && [ $# != 5 ]; then
    echo -E- wrong number of arguments
    exit 1
fi

for argument in "${sets_date[@]}"; do
    if ! [[ "$argument" =~ ^[0-9]{6}$ ]]; then
        echo "-${argument}- is not valid date"
        exit 1
    fi
done