gpt4 book ai didi

arrays - Bash:从另一个数组中删除一个数组中存在的项目

转载 作者:行者123 更新时间:2023-11-29 08:52:39 27 4
gpt4 key购买 nike

这个条目似乎是我想做的事情的大约 80%,但我想出的任何一个都不起作用:bash: how to delete elements from an array based on a pattern

我有两个数组:

@tapes_in_drives=(SP1026,SP0995,SP0434)

@tapes=(SP0001,SP0002,SP0434,SP0995,SP1026,SP2000,SP3000)

我需要一个 bash 解决方案,可以从@tapes 中删除@tapes_in_drives 中存在的所有条目。

我正在构建一个脚本,以根据到期日期等自动从磁带库弹出磁带。

我试过这个:

for i in "${tapes_in_drives[@]}"; do
tapes=(${tapes[@]//*$i*})
done

但它不起作用,没有任何内容被删除。

感谢您提供的任何帮助。

编辑:

这是我正在使用的代码,我最初是用 Perl 编写的,因此有 @variable 定义,写这个问题时我 super 累。

代码:

#!/usr/bin/bash

# If media expires less than this many days, keep it
export days_expired="30"

# Set to 1 to get debug output to console
export debug="1"

# Get list of SPxxxxx tapes that are physically in the library
if [ $debug -eq 1 ]; then echo "Getting tape list"; fi
export tapes=`vmquery -rn 1 -b | tail +4 | awk '{print \$1}' && vmquery -rn 4 -b | tail +4 | awk '{print \$1}'`

if [ $debug -eq 1 ]; then echo ${tapes[@]}; fi

# Query tape drives for tapes
export tapes_in_drives=`ssh srv-reg-nbms-01 "echo 's d q'|/usr/openv/volmgr/bin/tldtest -r /dev/smc0|grep 'Barcode'" | awk '{print $3}' && ssh srv-reg-nbms-02 "echo 's d q'|/usr/openv/volmgr/bin/tldtest -r /dev/smc0|grep 'Barcode'" | awk '{print $3}'`

if [ $debug -eq 1 ]; then
echo ""
echo "Tapes in Drives:"
echo ${tapes_in_drives[@]}
echo "";
fi


# Remove tapes in drives from list of tapes
for i in "${tapes_in_drives[@]}"; do
tapes=(${tapes[@]//*$i*})
done

echo "Tape List 2"
echo ${tapes[@]}

结果:

获取磁带列表

SP0011 SP0039 SP0402 SP0434 SP0464 SP0516 SP0551 SP0600 SP0604 SP0726 SP0731 SP0765 SP0767 SP0779 SP0781 SP0787 SP0793 SP0794 SP0805 SP0828 SP0830 SP0832 SP0927 SP0928 SP0936 SP0983 SP0995 SP1001 SP1004 SP1008 SP1015 SP1017 SP1026 SP1033 SP1036 SP1038 SP0042 SP0049 SP0150 SP0462 SP0473 SP0517 SP0557 SP0560 SP0642 SP0659 SP0697 SP0712SP0723SP0766SP0777SP0786SP0788SP0792SP0907SP0910SP0923SP0925SP0926SP0940SP0963SP0981SP0986SP0989SP0994SP0999SP1007SP1020SP1021SP1027SP1039

驱动器中的磁带:

SP1001 SP1038 SP0923 SP0926 SP0925

磁带列表 2

SP0011 SP0039 SP0402 SP0434 SP0464 SP0516 SP0551 SP0600 SP0604 SP0726 SP0731 SP0765 SP0767 SP0779 SP0781 SP0787 SP0793 SP0794 SP0805 SP0828 SP0830 SP0832 SP0927 SP0928 SP0936 SP0983 SP0995 SP1001 SP1004 SP1008 SP1015 SP1017 SP1026 SP1033 SP1036 SP1038 SP0042 SP0049 SP0150 SP0462 SP0473 SP0517 SP0557 SP0560 SP0642 SP0659 SP0697 SP0712SP0723SP0766SP0777SP0786SP0788SP0792SP0907SP0910SP0923SP0925SP0926SP0940SP0963SP0981SP0986SP0989SP0994SP0999SP1007SP1020SP1021SP1027SP1039

如您所见,tapes_in_drives 中的磁带名称并未从磁带阵列中删除。

最佳答案

正如评论所说,这只是语法错误。

用空格分隔数组条目,不要使用 @,该函数适用于您的示例数据。请注意,它会删除所有包含 tapes_in_drives 中的条目的条目,而不仅仅是那些与它完全匹配的条目。

tapes=(SP0001 SP0002 SP0434 SP0995 SP1026 SP2000 SP3000)
tapes_in_drives=(SP1026 SP0995 SP0434)
for i in "${tapes_in_drives[@]}"; do
tapes=(${tapes[@]//*$i*})
done

结果:

$ echo ${tapes[0]}
SP0001
$ echo ${tapes[1]}
SP0002
$ echo ${tapes[2]}
SP2000
$ echo ${tapes[3]}
SP3000
$ echo ${tapes[4]}

$

EDIT 以响应问题中的编辑

这一行:

export tapes=`vmquery -rn 1 -b | tail +4 | awk '{print \$1}' && vmquery -rn 4 -b | tail +4 | awk '{print \$1}'`

还有这一行:

export tapes_in_drives=`ssh srv-reg-nbms-01 "echo 's d q'|/usr/openv/volmgr/bin/tldtest -r /dev/smc0|grep 'Barcode'" | awk '{print $3}' && ssh srv-reg-nbms-02 "echo 's d q'|/usr/openv/volmgr/bin/tldtest -r /dev/smc0|grep 'Barcode'" | awk '{print $3}'`

tapestapes)in_drives 初始化为字符串,而不是数组。您需要在分配的值周围添加括号以将它们放入数组中,否则循环将不起作用。您也可以删除 export,除非您希望脚本生成的进程将这些 shell 变量继承为环境变量,否则没有必要这样做。

tapes=(`vmquery -rn 1 -b | tail +4 | awk '{print \$1}' && vmquery -rn 4 -b | tail +4 | awk '{print \$1}'`)

tapes_in_drives=(`ssh srv-reg-nbms-01 "echo 's d q'|/usr/openv/volmgr/bin/tldtest -r /dev/smc0|grep 'Barcode'" | awk '{print $3}' && ssh srv-reg-nbms-02 "echo 's d q'|/usr/openv/volmgr/bin/tldtest -r /dev/smc0|grep 'Barcode'" | awk '{print $3}'`)

关于arrays - Bash:从另一个数组中删除一个数组中存在的项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10020148/

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