我有一个bash程序,该程序从看起来像这样的文件中提取标记:
Jack ex1=5 ex2=3 quiz1=9 quiz2=10 exam=50
我希望代码执行,以便当我输入终端时:
./program -ex1 -ex2 -ex3
杰克的数据中没有EX3,因此将返回0的输出:
Jack 5 3 0
如何为每个未识别参数的程序编码我的程序输出0?
如果我了解您要做的事情,那并不困难。您需要做的是将每行读取到name
,其余部分读为marks
。(输入是从stdin
读取的)
然后,对于命令行上给出的每个参数,检查第一部分是否匹配marks
中任何等级的开头(=
符号的左侧大小)。如果这样做,请保存grade
(=
符号的右侧),然后将found
标志设置为1
。
检查第一个参数的所有标记后,如果found
标志为1
,则输出grade
,否则输出0
。重复所有命令行参数。(然后,对于所有文件中的学生),如果您有疑问,请告诉我:
#!/bin/bash
declare -i found=0 # initialize variables
declare -i grade=0
while read -r name marks; do # read each line into name & marks
printf "%s" "$name" # print student name
for i in "$@"; do # for each command line argument
found=0 # reset found (flag) 0
for j in $marks; do # for each set of marks check for match
[ $i = -${j%=*} ] && { found=1; grade=${j#*=}; } # if match save grade
done
[ $found -eq 1 ] && printf " %d" $grade || printf " 0" # print grade or 0
done
printf "n" # print newline
done
exit 0
输出
$ bash marks_check.sh -ex1 -ex2 -ex3 < dat/marks.txt
Jack 5 3 0