gpt4 book ai didi

arrays - Bash 数组脚本排除重复项

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:47:44 24 4
gpt4 key购买 nike

所以我为 Raspberry Pi 编写了一个 bash 脚本(名为 music.sh)来执行以下功能:

  • 执行后,查看一个目录(音乐文件夹)并选择一个随机文件夹进行查看。 (注意:这里的这些文件夹都没有子目录)
  • 一旦选择了“音乐”中的文件夹,然后按顺序播放所有 mp3 文件,直到到达最后一个 mp3 文件
  • 此时,脚本会返回到“Music”目录中的文件夹并选择另一个随机文件夹
  • 然后它将再次按顺序播放该文件夹中的所有 mp3 文件
  • 无限循环直到用户输入

我有这段代码可以执行上述所有操作,但以下项目除外:

  • 我不想播放以前播放过的任何其他“专辑”
  • 所有专辑播放一次后,关闭系​​统

到目前为止,这是我的代码(允许重复):

#!/bin/bash
folderarray=($(ls -d /home/alphekka/Music/*/))
for i in "${folderarray[@]}";
do
folderitems=(${folderarray[RANDOM % ${#folderarray[@]}]})
for j in "${folderitems[@]}";
do
echo `ls $j`
cvlc --play-and-exit "${j[@]}"
done
done
exit 0

请注意,没有一个文件夹或文件的名称中包含空格。如果有空格,那么我会遇到此代码工作的一些问题。

无论如何,我已经很接近了,但我还没有找到我正在寻找的全部功能。任何帮助将不胜感激!非常感谢你! :)

最佳答案

使用关联数组作为集合。请注意,这将适用于所有 有效的文件夹和文件名。

#!/bin/bash

declare -A folderarray
# Each folder name is a key mapped to an empty string
for d in /home/alphekka/Music/*/; do
folderarray["$d"]=
done

while [[ "${!folderarray[*]}" ]]; do
# Get a list of the remaining folder names
foldernames=( "${!folderarray[@]}" )
# Pick a folder at random
folder=${foldernames[RANDOM%${#foldernames[@]}]}
# Remove the folder from the set
# Must use single quotes; see below
unset folderarray['$folder']
for j in "$folder"/*; do
cvlc --play-and-exit "$j"
done
done

处理包含空格(可能还有其他特殊字符)的键是很棘手的。上面对 unset 的调用中显示的引号不是通常意义上的句法引号。它们不会阻止 $folder 被扩展,但它们确实似乎被 unset 本身用来引用结果字符串。

关于arrays - Bash 数组脚本排除重复项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40389494/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com