Bash数组不能提供预期的长度

  • 本文关键字:数组 不能 Bash bash
  • 更新时间 :
  • 英文 :


我试图在一个目录中获得所有jar文件并将它们存储在一个数组中。目前,它没有像预期的那样工作我认为这是因为它是数组中的数组?让我知道如果它是,我该如何解决它。当我回显数组的长度时,它总是1,但当我循环它时,它可以有多于1个文件。

代码:

#!/bin/bash
cd "/home/ubuntu/RLCraft" || exit 1
jars=("$(ls *.jar)")
echo "${#jars[@]}" -gt "1"
if (("${#jars[@]}" > "1")); then
echo "yes"
else
echo "no"
fi
for i in "${jars[@]}"; do
echo "$i"
done
if [ "${#jars[@]}" -gt 1 ]; then
echo "Choose a server jar:"
for i in "${jars[@]}"; do
echo "$i"
done
read -r serverJar
else
serverJar="${jars[0]}"
fi

预期输出:

yes
magma-server.jar
minecraft_server.1.12.2.jar

输出结果:

no
magma-server.jar
minecraft_server.1.12.2.jar

要从所有.jar文件中填充数组,只需执行以下操作:

array=(*.jar)

这是你的固定脚本:

#!/usr/bin/env bash
shopt -s nullglob
cd "/home/ubuntu/RLCraft" || exit 1
jars=(*.jar)
if [ "${#jars[@]}" -gt 1 ]; then
echo "Choose a server jar:"
selections=("${jars[@]}" 'Quit')
select serverJar in "${selections[@]}"; do
case $serverJar in
'')
echo "Invalid choice" >&2
;;
'Quit')
echo "Goodby!"
exit
;;
*)
echo "You have selected: $serverJar"
break
;;
esac
done
else
echo "No jar found in $PWD" >&2
fi

问题是在创建数组时。

jars=("$(ls *.jar)")

当您这样做时,引号会导致整个列表被解释为单个元素。删除引号以解决如下问题:

jars=($(ls *.jar))

编辑:

正如在注释中提到的,一个更好的方法是不使用ls作为

jars=(*.jar)

最新更新