我试图在一个目录中获得所有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)