Case 문 내의 if 문

Case 문 내의 if 문

내 논리는 변수에 부동 소수점 또는 정수가 포함되어 있는지 확인한 다음 변수가 부동 소수점인 경우 게시한 다음 가장 가까운 높은 숫자로 숫자를 반올림해야 하고 정수인 경우 그대로 인쇄해야 합니다.

if echo "$FS" | grep "^[0-9]*$" > /dev/null
then
echo "Integer"
elif echo "FS" | grep "^[0-9]*[.][0-9]*$" > /dev/null
then
echo "Floating"
fi

이것은 잘 작동하지만 사례 설명과 통합하면 문제가 발생합니다.

#!/bin/bash
IP_DIR=$1
ACTUAL=$2
typeset -l ACTUAL
RETURNSIZE=$3
typeset -l RETURNSIZE

if [ -d "$IP_DIR" ]; then
for OUTPUT in $(find $IP_DIR -maxdepth 1 | awk 'NR>1')
do
        if [ "$ACTUAL" == "true" ]; then
                case $RETURNSIZE in
                "gb") FS=`du -b $OUTPUT | awk {'print $1'}`
                      FS=$(echo "scale=12; $FS  / 1073741824" | bc)
                      echo $OUTPUT "|" $FS "GB";;
                "mb") FS=`du -b $OUTPUT | awk {'print $1'}`
                      FS=`echo $FS | awk '{ byte =$1 /1024/1024 ; print byte " MB" }'`
                      echo $OUTPUT "|" $FS;;
                "kb") FS=`du -b $OUTPUT | awk {'print $1'}`
                      FS=`echo $FS | awk '{ byte =$1 /1024 ; print byte " KB" }'`
                      echo $OUTPUT "|" $FS;;
                "b")  FS=`du -b $OUTPUT | awk {'print $1'}`
                      echo $OUTPUT "|" $FS "B";;
                "all")FS=`du -h $OUTPUT | awk {'print $1'}`
                      echo $OUTPUT "|" $FS;;
                esac
        elif [ "$ACTUAL" == "false" ]; then
               case $RETURNSIZE in
                "gb") FS=`du -b $OUTPUT | awk {'print $1'}`
                      FS=$(echo "scale=12; $FS  / 1073741824" | bc)
                      if [[ $FS == ^[0-9]*$ ]]; then echo $OUTPUT "|" $FS "GB" ;elif [[ $FS == ^[0-9]*[.][0-9]*$ ]]; then echo "$OUTPUT "|" $FS "GB round"; fi
                      ;;#echo $OUTPUT "|" $FS "GB Needed to be rounded";;
                "mb") FS=`du -m $OUTPUT | awk {'print $1'}`
                      echo $OUTPUT "|" $FS "MB";;
                "kb") FS=`du -k $OUTPUT | awk {'print $1'}`
                      echo $OUTPUT "|" $FS "KB";;
                "b")  FS=`du -b $OUTPUT | awk {'print $1'}`
                      echo $OUTPUT "|" $FS "B";;
                "all")FS=`du -h $OUTPUT | awk {'print $1'}`
                      echo $OUTPUT "|" $FS;;
                esac


        fi
done
else
echo "Directory Not Found"
fi

잘못된 정보

.sh: 48행: 일치하는 ""를 찾는 동안 예기치 않은 EOF가 발생했습니다. .sh: 50행: 구문 오류: 예기치 않은 파일 끝

답변1

이 스크립트에는 여러 가지 문제가 있습니다.

누락된 부분은 "31번째 줄입니다.

echo "$OUTPUT "|" $FS "GB round"

awk {'print $1'}대신에 사용할 수도 있습니다 awk '{print $1}'.

전체 목록구문론적질문, 스크립트를 넣으세요주택 검사.

du -b $OUTPUT | awk {'print $1'}여러 호출을 하나로 단순화하는 것(유지 관리를 더 쉽게 만드는 것) 과 같이 더 나은 작업을 수행할 수 있는 많은 작업이 있습니다 .

또한 변수 확장 주위에 두 개의 큰따옴표가 누락되었습니다.

답변2

내가 꽂을게shellcheck.net, 이 질문에 답하는 데 도움이 되기 때문입니다. 그것은 불평했다 :

^-- SC1079: 이것은 실제로 끝 인용문이지만 다음 문자 때문에 의심스러워 보입니다.

실제로 31행에는 다음이 있습니다.

if [[ $FS == ^[0-9]*$ ]]; then echo $OUTPUT "|" $FS "GB" ;elif [[ $FS == ^[0-9]*[.][0-9]*$ ]]; then echo "$OUTPUT "|" $FS "GB round"; fi

가독성을 위해 분류하면 다음과 같습니다.

if [[ $FS == ^[0-9]*$ ]]
then 
  echo $OUTPUT "|" $FS "GB"
elif [[ $FS == ^[0-9]*[.][0-9]*$ ]]
then 
  echo "$OUTPUT "|" $FS "GB round"
fi

echo "$OUTPUT...이 시점에서 마지막 견적이 불균형하다는 것을 더 쉽게 알 수 있습니다 .

관련 정보