
2つのアセットを確認する必要があります。
- ファイルコンテンツ形式
- このコンテンツを繰り返します。
したがって、コンテンツファイルは次のようになります。
key1=value
key2=value2
...
したがって、各行には型が必要ですkey=value
。前後にスペースを入れることはできません=
。このファイルの内容はenv形式のファイルでなければなりません。
一方、ループ内で各行をaとaに分割する必要がありますkey
。value
どんなアイデアがありますか?
答え1
バッシュ使用:
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
検証は3つのステップで行われます。これらの条件のいずれかが満たされない場合はエラーが発生し、最初の例ではエラー状態終了コードで実行が中断されます。
$1
- (入力仕様の用語で)「キー」があることを確認してください。$2
- (入力仕様の用語で)「値」があることを確認してください。NF==2
- 前述の「キー」と「値」フィールドが2つしかないことを確認してください。