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_1and作為某些函數的輸入。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/shor#!/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" ]

最後,您需要選擇一個 shell 來使用。ksh與 不一樣 與bash不一樣sh。雖然它們具有極其相似的語法,但並不完全相同,並且根據您使用的內容,某些功能的工作方式會有所不同。例如,sh不支援<(command).

至於你嘗試的算術,你只需要確保語法正確,你需要使用「算術上下文」。s=$c_2+1只是做了一個簡單的變數賦值。它將變數的值設為$s的值$c_2細繩 +1添加:

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

您的第二個範例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 "

因此,如果您按照我在開始時描述的方式修復該文件,這種情況就會消失。

相關內容