使用grep的UNIX While循环
我正在尝试创建一个while循环,用于检查数据文件中的特定字符串$username,如果在数据文件中发现该字符串的副本,则会在其末尾添加一个数字。这就是我所拥有的,由于某种原因,我在包含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
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