![Shell:检查行格式文件并循环遍历文件行](https://linux22.com/image/135902/Shell%EF%BC%9A%E6%A3%80%E6%9F%A5%E8%A1%8C%E6%A0%BC%E5%BC%8F%E6%96%87%E4%BB%B6%E5%B9%B6%E5%BE%AA%E7%8E%AF%E9%81%8D%E5%8E%86%E6%96%87%E4%BB%B6%E8%A1%8C.png)
我需要检查 2 项资产:
- 文件内容格式
- 迭代该内容:
因此,内容文件必须是:
key1=value
key2=value2
...
因此,每一行必须具有格式key=value
。之前或之后不允许有空格=
。该文件内容必须是 env 格式文件。
另一方面,我需要将每一行分成循环内的akey
和 a 。value
有任何想法吗?
答案1
使用bash:
n=0
while IFS="=" read -r key value; do
((n++))
if [[ -z $key ]]; then echo "missing key on line $n"; continue; fi
if [[ -z $value ]]; then echo "empty value on line $n"; continue; fi
echo "key:>$key<; value:>$value<"
done <<END
key1=value1
key2=value2
key3=
=value3
foo
key4=value4=value5=value6
END
输出
key:>key1<; value:>value1<
key:>key2<; value:>value2<
empty value on line 3
missing key on line 4
empty value on line 5
missing key on line 6
key:>key4<; value:>value4=value5=value6<
答案2
将此文件指定为input
:
key1=value1
key2=value2
key3=
=value3
key4=value4
我们可以用作=
字段分隔符awk
:
$ awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR; exit 1} { print $1, $2 }' input
key1 value1
key2 value2
File failed validation on line 3
要将验证错误消息抛出到标准错误,print
可以修改该语句,并且要在看到错误后继续处理,请将语句更改exit
为以下next
语句:
$ awk -F= '!($1 && $2 && NF==2) { print "File failed validation on line " NR | "cat 1>&2"; next } { print $1, $2 }' input
[stdout] key1 value1
[stdout] key2 value2
[stdout] key4 value4
[stderr] File failed validation on line 3
[stderr] File failed validation on line 4
验证分三个步骤完成;如果不满足这些条件中的任何一个,则会抛出错误,并且在第一个示例中,执行将中止并显示错误状态退出代码:
$1
- 确保有(用输入规范的说法)一个“密钥”$2
- 确保有(用输入规范的说法)一个“值”NF==2
- 确保只有两个字段;前面提到的“键”和“值”