내 논리는 변수에 부동 소수점 또는 정수가 포함되어 있는지 확인한 다음 변수가 부동 소수점인 경우 게시한 다음 가장 가까운 높은 숫자로 숫자를 반올림해야 하고 정수인 경우 그대로 인쇄해야 합니다.
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
...이 시점에서 마지막 견적이 불균형하다는 것을 더 쉽게 알 수 있습니다 .