首页 > 解决方案 > 如何在bash中将数组作为参数?

问题描述

我使用 create.sh 创建随机密码,其中每个密码都附加到我回显的数组中,并将扩展版本(即 [@])提供给选择脚本。

在选择脚本中,我无法访问数组。我回应了它的长度,它说是 1。即使当我打印时其中有 2 个元素被空格分隔。现在我无法访问 1 的索引,因为只有索引 0 存在,它是由空格连接的所有元素。

提前致谢。罗伯特

创建.sh

SEQ_LEN=1
MAX_CHAR=25
PASSWORDS=()
COUNTER=0

while getopts "x:l:" OPTION; do
    case $OPTION in
        x )
            SEQ_LEN="$OPTARG"
            ;;
        l )
            MAX_CHAR="$OPTARG"
            ;;
        \? )
            echo "correct usage: create [-x] [SEQ_LEN] [-l] [MAX_CHAR]"
            exit 1
            ;;
    esac
done
shift "$(($OPTIND -1))"

for VAR in $(seq 1 $SEQ_LEN)
do
    PASS=$(openssl rand -base64 48 | cut -c1-$MAX_CHAR)
    PASSWORDS[$COUNTER]="$PASS"
    COUNTER=$(($COUNTER +1))
done
echo "${PASSWORDS[@]}"

选择.sh

#!/bin/bash
ARRAY=()
INDEX=0

while getopts "a:i:" OPTION; do
    case $OPTION in
        a )
            ARRAY=$OPTARG
            ;;
        i )
            INDEX=$OPTARG
            ;;
        \? )
            echo "Correct Usage: select [-a] [PASSWORD_ARRAY] [-i] [SELECTED_INDEX]"
            ;;
    esac
done

echo "$ARRAY $INDEX"  # looks identical
echo "${#ARRAY[@]}"  # is 1 - should be 2

标签: arraysbash

解决方案


感谢您的回答和有用的建议。既然 bash 太棒了,事实证明你可以做到

ARRAY=( $OPTARG )

它用“”分割 $OPTARG 字符串,把它变成一个“数组”

“显然”您可以只 for 循环遍历字符串并附加到一个新变量,该变量被声明为 -a 数组。来源 如下图:

sentence="This is   a sentence."
for word in $sentence
do
    echo $word
done

推荐阅读