我的问题是关于我被要求为大学编写的一个脚本,所以它是 H/W,但我陷入困境,还没有找到解决方案。
我试图得到以下论据
./tool.sh -f persons.dat -id <id>
因为我想要显示该人的数据。
tool.sh
是我的程序,persons.dat
是一个包含人员数据的文件,如下所示
3601|Wang|Lin|male|1981-01-02|2010-03-14T19:06:18.373+0000|1.10.108.68|Firefox
id|lastName|firstName|gender|birthday|creationDate|locationIP|browserUsed
我知道我不能使用 getopts 因为 id 是一个两个字母的标志,我可以手动传递它,但我被要求不要考虑这个位置,所以:
./tool.sh -f persons.dat -id <id>
和:
./tool.sh -id <id> -f persons.dat
应该是一样的用途
有任何想法吗?
答案1
如果您的问题仅限于这两个选项,则类似:
usage() {
echo "tools.sh -id <id> -f <file>"
echo "note: order of options is not important"
}
if [ $# -ne 4 ]; then
echo "Wrong number of arguments"
usage
exit 1
fi
if [ "$1" = "-f" -a "$3" = "-id" ]; then
file="$2"
id="$4"
elif [ "$1" = "-id" -a "$3" = "-f" ]
then
file="$4"
id="$2"
else
echo "Wrong syntax!"
usage
exit 1
fi
然后,您可以使用 awk 解析您的文件:
awk -F'|' -v id="$id" '$1==id{printf "ID: "$1"\nUser: "$2" "$3"\nGender: "$4"\nBorn: "$5"\nCreation Date: "$6"\nLocation IP: "$7"\nBrowser used: "$8"\n"}' $file
if [ $? -eq 0 ]
then
exit 0
else
echo "Something went \"woopsie!\""
exit 1
fi
为了使它更好,您还可以检查这id
是一个数字,并且确实是您的...persons.dat
中某处的文件。PATH
答案2
awk -F\| 'NR==1{
for(j=1;j<=NF;j++)
Arr[j]=$j;
next
}
{
printf("./tool.sh -f file --edit");
for(i=1;i<=NF;i++)
printf("%s %s ",Arr[i],$i)
}
{
printf("\n")
}' persons.dat