如果找到多个匹配项,则使用用户交互的Bash脚本

如果找到多个匹配项,则使用用户交互的Bash脚本,bash,Bash,我使用bash脚本(user_remove.sh)从文件名地址簿中删除用户。 用户_remove.sh执行以下操作: 1) 通过类似命令的参数获取单个输入,并将其指定给名为的变量。(name=“$1”) 2) grep地址簿中的名称,重新定向输出wc命令,并将结果存储在变量匹配中 3) 测试条件匹配是否大于1,如果是(零),回显消息将打印“多个匹配;请选择一个以删除”,并与用户交互以请求确认(y/n)y以删除匹配的用户 #!/bin/bash name="$1" matches=$(grep

我使用bash脚本(user_remove.sh)从文件名地址簿中删除用户。 用户_remove.sh执行以下操作:

1) 通过类似命令的参数获取单个输入,并将其指定给名为的变量。(name=“$1”)

2) grep地址簿中的名称,重新定向输出wc命令,并将结果存储在变量匹配中

3) 测试条件匹配是否大于1,如果是(零),回显消息将打印“多个匹配;请选择一个以删除”,并与用户交互以请求确认(y/n)y以删除匹配的用户

#!/bin/bash

name="$1"

matches=$(grep "$name" address_book | wc -l)


if [ "$matches" -gt 1 ]
then
    echo "More than one match; Please select one to remove"
    echo "$name Remove (y/n)?"
    read answer

    if [ "$answer" = y ]
    then
             grep -v "$name" address_book > my_tmp/address_book
             mv my_tmp/address_book address_book

    elif [ "$answer" = n ]
    then
            exit 0
    else
            echo "I could not find $name in address_book"

    fi
fi
地址簿文件包含两行数据:

test abc
test xyz
运行示例:

$./user_remove.sh test
More than one match; Please select one to remove
test Remove (y/n)?y
我的问题是:我希望输出如下:

More than one match; Please select one to remove
test abc Remove (y/n)?y
test xyz Remove (y/n)?n
你能帮我一下吗


谢谢

这里对您现有的进行了一个小的调整。关键是在循环之前将匹配项存储在数组中

#!/bin/bash

name="$1"

# Find all matches
matches=()
while read -r match
do
    matches+=("$match")
done < <(grep "$name" address_book)

# Loop through matches if more than one found
if [ "${#matches[@]}" -gt 1 ]
then
    for match in "${matches[@]}"
    do
        echo "More than one match; Please select one to remove"
        echo "$match Remove (y/n)?"
        read answer

        if [ "$answer" = y ]
        then
             grep -v "$match" address_book > my_tmp/address_book
             mv my_tmp/address_book address_book

        elif [ "$answer" = n ]
        then
             exit 0
        else
             echo "I could not find $name in address_book"
        fi
    done
fi
#/bin/bash
name=“$1”
#查找所有匹配项
匹配项=()
而read-r匹配
做
匹配项+=(“$match”)
完成<我的tmp/地址簿
mv我的tmp/地址簿地址簿
elif[“$answer”=n]
然后
出口0
其他的
echo“我在通讯簿中找不到$name”
fi
完成
fi
但你可能真正想要的是这个

#!/bin/bash

name="$1"

matches=()
while read -r match
do
    matches+=("$match")
done < <(grep "$name" address_book)

if [ "${#matches[@]}" -gt 1 ]
then
    echo "More than one match; Please select one to remove"
    for match in "${matches[@]}"
    do
        echo "$match Remove (y/n)?"
        read answer

        if [ "$answer" = y ]
        then
            grep -v "$match" address_book > address_book2
            mv my_tmp/address_book address_book
        fi
    done
elif [ "${#matches[@]}" -eq 1 ]
then
    echo "I found one occurence of $name in address_book"
else
    echo "I could not find $name in address_book"
fi
#/bin/bash
name=“$1”
匹配项=()
而read-r匹配
做
匹配项+=(“$match”)
完成
你好,流感,谢谢你的回答。你的想法对我很管用。这里我有一个问题,matches+=(“$match”)这部分的含义是什么?你能告诉我吗?嗨@user6420577,很高兴它能工作。这会将整个匹配(通过grep)行追加到名为matches的数组中。引用它是为了保留整行,而不是每行中的每个单词。另外@user6420577,如果您认为这是正确的答案,请您检查一下。非常感谢。如果match大于1,则如何测试条件,否则match等于1。@user6420577,对不起,我错过了那个细节。补充。