我的逻辑是检查变量包含浮点或整数,然后发布该变量是否为浮点数,然后必须将数字四舍五入到最接近的更高数字,并且如果它是整数则按原样打印。
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
报价不平衡。