내 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
두 번째 예는 산술 컨텍스트를 설정하기 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 "
따라서 처음에 설명한 대로 파일을 수정하면 문제가 해결됩니다.