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

这工作得很好,但是当我将其与 case 语句集成时,问题就出现了。

#!/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报价不平衡。

相关内容