UNIX While While循环使用grep

时间:2017-12-09 00:01:13

标签: unix

我正在尝试创建一个while循环来检查我的数据文件中的特定字符串$ username,如果在数据文件中找到它的副本,则会在其末尾添加一个数字。这就是我所拥有的,并且由于某种原因,我得到了一个错误"太多的论点"对于包含while循环的行。任何帮助将不胜感激。

    tput cup 3 12
    echo "Enter the first name of the user: "
    tput cup 3 47; read firstName
    tput cup 4 12; echo "Enter the last name of the user: "
    tput cup 4 45; read lastName
    username=${firstName:0:1}${lastName:0:4}
    i=0
    while [ -n $(grep -q -F "$username" capstonedata.txt) ]
    do
            let i=$i+1
            username=$username$i
    done
    userdata=${firstName}":"${lastName}":"${username}
    echo $userdata | tr [a-z] [A-Z] >> capstonedata.txt

1 个答案:

答案 0 :(得分:1)

您需要确定命令的结果是否为空字符串,而不是自己的命令。尝试

while [ -n $(grep -q -F "$username" capstonedata.txt) ]

修改

在shell脚本中为变量赋值时,常见错误是添加额外的美元符号。切勿使用

之类的东西
$username=...

如果要为名为username的变量指定内容。删除之前的美元符号。另一方面,您需要使用i=$i+1

除此之外,我并不真正了解您尝试使用username=$username[i]实现的目标。

以下脚本可能会满足您的需求,也可能不会,这取决于我是否有正确的意图。

#!/bin/bash

(cat <<EOF
$username
EOF
)|(while read line
do
        cnt=`grep "\b$line[0-9]*\b" capstonedata.txt| wc -l`
        if [ $cnt -gt 1 ]
        then
                echo $line$cnt
        else
                echo $line
        fi
done
)

由于OP进一步明确了他的需求,脚本可以变得更加简单。

cnt=`grep "\b$username[0-9]*\b" capstonedata.txt|wc -l`
if [ "$cnt" -eq "0" ]; then
    cnt=
fi
username=$username$cnt

说明:"$username[0-9]*"$username匹配,后面带有可选数字,“\ b”匹配字边界(但这似乎只适用于某些系统上的egrep,尽管它有效在我的系统上完全正常,您可以使用grep "\<$username[0-9]*\>"作为更安全的选项),这样当$username为“ab”时,您不会意外地匹配“abcd”行。 wc -l计算匹配行的数量,因此如果用户名出现一次,则结果为1.反向标记用于将命令的结果分配给变量,在本例中为{ {1}}。 $cnt - 子句将if设置为空字符串(如果它为0)(即文件中没有匹配)。最后一行只是将$cnt附加到原始用户名。因此,如果有一行与正则表达式匹配,则结果将为$cnt并附加1。正是你需要的。