我有一个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个输入参数,并且不会有任何其他组合。
答案 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