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_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" ]
ただし、「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 "
したがって、最初に説明したようにファイルを修正すれば、この問題は解消されます。