我在從 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
and作為某些函數的輸入。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
or#!/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 "
因此,如果您按照我在開始時描述的方式修復該文件,這種情況就會消失。