9번째 단어가 숫자인 표준 형식 파일을 읽는 스크립트가 있습니다. 파일에서 읽은 숫자를 비교하려고 합니다. 나는 그 줄을 정확하게 읽을 수 있고 내가 원하는 방식으로 정확하게 작동합니다. 하지만 오류 메시지가 나타납니다.
./age.sh: line 8: [: age: integer expression expected
이것은 내 스크립트입니다.
#!/bin/bash
if [ -f $1 ] ;
then
while read -r LINE || [[ -n $LINE ]]; do
name=$( echo $LINE | cut -d " " -f1 -f2)
ago=$( echo $LINE | cut -d " " -f9)
echo "$name ----- $age"
if [ $ago -gt 30 ] ; then
echo "You get a discount"
fi
done < $1
else
echo "No file found"
fi
다음은 샘플 입력 파일입니다.
#FirstName LastName SuperheroName Powers Weapons City Enemy isOutOfEarth Age
Bruce Wayne Batman Martial_arts No_Guns Gowtham Joker No 31
Clark Kent Superman Extreme_strength None Metropolitan Lex_Luther Yes 32
Oliver Queen Green_arrow Accuracy Bow_and_Arrow Star_city Cupid No 30
답변1
귀하가 겪고 있는 구체적인 오류는 귀하의 스크립트가 파일 헤더도 처리하고 있기 때문입니다. 간단한 해결 방법은 다음으로 시작하는 줄을 건너뛰는 것입니다 #
.
#!/bin/bash
if [ ! -f "$1" ]; then
echo "No file found"
exit 1
fi
## Use grep -v to print lines that don't match the pattern given.
grep -v '^#' "$1" |
while read -r LINE || [ -n "$LINE" ]; do
name=$( echo "$LINE" | cut -d " " -f1,2)
age=$( echo "$LINE" | cut -d " " -f9)
echo "$name ----- $age"
if [ "$age" -gt 30 ]; then
echo "You got a discount"
fi
done
그러나 다른 열에 대해서도 작업을 수행할 수도 있으므로 모든 열을 변수로 읽어 들일 것입니다.
#!/bin/bash
if [ ! -f "$1" ]; then
echo "No file found"
exit 1
fi
## read can take multiple values and splits the input line on whitespace
## automatically. Each field is assigned to one of the variables given.
## If there are more fields than variable names, the remaining fields
## are all assigned to the last variable.
grep -v '^#' "$1" | while read -r first last super powers weapons city enemy isout age; do
echo "$first $last ----- $age"
if [ "$age" -gt 30 ]; then
echo "You got a discount"
fi
done
답변2
#!/bin/bash
if [ ! -f "$1" ]; then
echo "No file found"
exit 1
fi
exec < $1
while read -r LINE || [ -n "$LINE" ]; do
name=$( echo "$LINE" | cut -d " " -f1,2)
age=$( echo "$LINE" | cut -d " " -f9)
echo "$name ----- $age"
if [ "$age" -gt 30 ]; then
echo "You got a discount"
fi
done
답변3
이것이 내가 한 일입니다:
#!/bin/bash
if [ -f $1 ] ;
then
sum=0
echo "#FirstName LastName City Age"
while read -r LINE || [[ -n $LINE ]]; do
name=$( echo $LINE | cut -d " " -f1 -f2)
city=$( echo $LINE | cut -d " " -f3)
age=$( echo $LINE | cut -d " " -f9)
check=$( echo $amount | grep -c "[0-9]")
if [ $check -gt 0 ]; then
if [ $age -gt 30 ] ; then
echo "You get a discount"
fi
fi
done < $1
else
echo "No file found"
fi
답변4
나는 bash 배열로 다음 줄을 읽었습니다.
if [[ -f $1 ]] ; then
while read -ra line; do
(( ${#line[@]} > 0 )) || continue # skip empty lines
name=${line[*]:0:2}
age=${line[-1]}
echo "$name ----- $age"
if (( $age > 30 )); then
echo "You get a discount"
fi
done < "$1"
else
echo "No file found"
fi
#FirstName LastName ----- Age
Bruce Wayne ----- 31
You get a discount
Clark Kent ----- 32
You get a discount
Oliver Queen ----- 30
$age가 정수가 아닌 경우에도 문제가 발생하지 않습니다.
$ age=Age
$ [ $age -gt 30 ] && echo old || echo young
bash: [: Age: integer expression expected
young
$ (( $age > 30 )) && echo old || echo young
young
$ [[ $age -gt 30 ]] && echo old || echo young
young