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 "
したがって、最初に説明したようにファイルを回復すると、この状況は消えます。