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

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

Linux マシン上の csv ファイルから変数を取得して、で使用する際に少し問題が発生していますif。次のような csv があります。

Name;Age
Marc;18
Joseph;10

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

私のbashコード:

#!/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_1c_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" ]

ただし、「can drive」の出力に基づいて、変数の値が と等しいかそれより大きいかどうかを確認したいと思われるので、18を使用します-ge

 if [ $c_2 -ge "18" ]

最後に、使用するシェルを 1 つ選択する必要があります。 はと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 "

したがって、最初に説明したようにファイルを修正すれば、この問題は解消されます。

関連情報