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_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
or#!/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 "
因此,如果您按照我在開頭描述的那樣修復文件,這種情況就會消失。