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 "
따라서 처음에 설명드린 대로 파일을 복구하시면 이런 상황은 사라질 것입니다.