使用grep的UNIX While循环

使用grep的UNIX While循环,unix,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

我正在尝试创建一个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

您需要确定命令的结果是否为空字符串,而不是命令本身。试一试

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
)

说明:
“$username[0-9]*”
$username
匹配,后面有可选数字,“\b”与单词边界匹配(但这似乎仅适用于某些系统上的
egrep
,虽然它在我的系统上工作得很好,但您可以使用
grep”\
作为更安全的选项)这样当
$username
为“ab”时,您就不会意外地匹配行“abcd”
wc-l
统计匹配行数,因此如果用户名出现一次,结果将为1。反勾号用于将命令的结果分配给变量,在本例中为
$cnt
if
-子句将
$cnt
设置为空字符串(如果为0)(即文件中没有匹配项)。最后一行只是在原始用户名后面添加
$cnt
。因此,如果有一行与正则表达式匹配,结果将是
$username
,并附加一个1。这正是您需要的。

谢谢,错误不再出现,但是数据没有插入到文件中,当命令运行时,它只是在循环结束后停止。脚本中还有其他问题,但由于您只在if语句中提到了错误,因此我没有修改其他部分。我将修改我的答案以满足您的需要。我已经意识到我的一些错误,但它仍然在循环后停止,并且在[-n$(grep-q-F“$username”capstonedata.txt)]时不会继续执行脚本I=0do let i=$i+1 username=$username$i基本上我要做的是确定文件中是否存在用户名的重复项,如果存在,则在文件末尾追加一个数字,以1的增量递增。例如,如果存在用户名aaron,则将创建用户名aaron1,而不是重复的用户名。如果已经有用户名aaron1,将创建aaron2。我将用整个脚本编辑我的帖子。因为你在代码中使用了
grep-F
,我想
$username
包含不止一行,是吗?我已经意识到了我的一些错误,但它仍然没有做到我所说的“I=0,而[-n$(grep-q-F“$username)”capstonedata.txt)]do let i=$i+1 username=$username$i done'
cnt=`grep "\b$username[0-9]*\b" capstonedata.txt|wc -l`
if [ "$cnt" -eq "0" ]; then
    cnt=
fi
username=$username$cnt