我正在尝试创建一个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
答案 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。正是你需要的。