Bash

Bash 腳本:csv 文件中的變數有問題

  • June 2, 2021

我在從我的 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/shor#!/bin/bash給我同樣的結果。

謝謝你的幫助 :)

您的第一個問題是您使用的是 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 "

因此,如果您按照我在開頭描述的那樣修復文件,這種情況就會消失。

引用自:https://unix.stackexchange.com/questions/652435