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