Bashスクリプト:csvファイルの変数の問題

Bashスクリプト:csvファイルの変数の問題

Linuxコンピュータのcsvファイルから変数を取得し、if次のcsvに入れます。

Name;Age
Marc;18
Joseph;10

関数で使用するためにcsvからこの情報を取得しようとしています。

私のバッシュコード:

#!/bin/ksh

while IFS=";" read -r c_1 c_2 

do
  echo "Name : $c_1"
  echo "Age : $c_2"
   
if [ $c_2 == "18" ]
then
    echo "$c_1 can drive"
fi

done < <(tail -n +2 teste_input.csv)

私のコードを実行した後、次のようになります。

Name : Marc
Age : 18
Name : Joseph
Age : 10

私はそれを楽しみにしています:

Name : Marc
Age : 18
Marc can drive
Name : Joseph
Age : 10

成功していないままたくさん試してみました。何の問題もなく、c_1一部の機能への入力として、およびを使用できます。c_2問題は、計算しようとしたときに発生します。

私がするなら:

s=$c_2+1
d=$((${c_2}+1))

次を返します。

+1
+1")syntax error: invalid arithmetic operator (error token is "

同じ質問を使用してください d=$(("${c_2}+1"))

機能させるには何を変更する必要がありますか?#!/bin/ksh#!/bin/shまたはを使用すると、#!/bin/bash同じ結果が表示されます。

あなたの助けをいただきありがとうございます:)

答え1

最初の問題は、Windowsのテキストファイルを使用していることです。 CSVにWindowsスタイルの行末(\r\n)があります。次の方法を使用して問題を解決できます。

dos2unix teste_input.csv

またはdos2unixまだインストールしていない場合は、次の操作を行います。

sed -i 's/\r//g' teste_input.csv

これにより、コードは予想される出力を生成します。ほとんど:

$ foo.sh teste_input.fixed.csv 
Name : Marc
Age : 18
$c_1 can drive
Name : Joseph
Age : 10

これは、$c_1次の行の一重引用符によるものです。

echo '$c_1 can drive'

変数は単一引用符内で拡張されないため、表示される内容$c_1は変数値ではありません。以下を行う必要があります。

echo "$c_1 can drive"

次の問題は==算術ではなく文字列比較です。ここでは機能しますが、数値を比較するには次のものが必要です-eq

if [ $c_2 -eq "18" ]

ただし、「運転可能」出力に基づいて変数値が同じか大きいかどうかを確認したいと思われるので、18次のようにします-ge

 if [ $c_2 -ge "18" ]

最後に使用するシェルを選択する必要があります。ksh等しくないとbash等しくないsh。構文は非常に似ていますが、同じではなく、一部の機能は使用する項目によって異なります。たとえば、サポートされshていません<(command)

あなたが試している算術の場合は、構文が正しいことを確認し、「算術コンテキスト」を使用する必要があります。s=$c_2+1単純な変数割り当てを行いました。変数の値を$s次の値に設定します。$c_2ひも +1次に追加:

$ c_2=10
$ s=$c_2+1
$ echo "$s"
10+1

2番目の例は、算術コンテキストが設定されているd=$((${c_2}+1))ために機能します。(( ))

$ c_2=10
$ d=$((${c_2}+1))
$ echo "$d"
11

Windows行の終わりによる構文エラー:

$ c_2=10$'\r'
$ d=$((${c_2}+1))
+1")syntax error: invalid arithmetic operator (error token is "

したがって、最初に説明したようにファイルを回復すると、この状況は消えます。

関連情報