非法数字 - Shell脚本

时间:2015-01-06 11:46:13

标签: linux shell

我的代码工作正常然后第二天我

./Desktop/audiolog.sh: 32: [: /proc/: unexpected operator

./Desktop/audiolog.sh: 13: ./Desktop/audiolog.sh: Illegal number: 08

这可能是秒数内的数字08吗?任何指针都会很棒,谢谢

#!/bin/sh  

DAY=$(date +%d)                          
MO=$(date +%m)                             
YR=$(date +%y)                 
SE=$(date +%S)                             
H=$(date +%H)                                                           
M=$(date +%M)  

NOW=$(date)

DURATION=$(((60 - M) * 60-SE))

PART=$(find /mnt/hgfs/Audio\ Log/ -type f -name "RBLoggerAudio ${DAY}-${MO}-${YR}\ ${H}*" | wc -l)

reset

echo "Recording for $DAY $MO $YR - $H 00"
echo "Started at $NOW"
echo "- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -"

if [ "$PART" -eq 0 ]
then
    arecord -f cd -c 1 -d$DURATION -t raw -v -v | lame -b 64 -q8 -mm -r - /mnt/hgfs/Audio\ Log/"RBLoggerAudio "$DAY-$MO-$YR\ $H"00".mp3    
else
    arecord -f cd -c 1 -d$DURATION -t raw -v -v | lame -b 64 -q8 -mm -r - /mnt/hgfs/Audio\ Log/"RBLoggerAudio "$DAY-$MO-$YR\ $H"00 - Part - "$PART.mp3
fi


pid=$(ps -opid= -C audiolog.sh)
while [ -d /proc/$pid ] ; do
    sleep 1
done && ./Desktop/audiolog.sh

2 个答案:

答案 0 :(得分:0)

更改此

while [ -d /proc/$pid ] ; do

while [ -d "/proc/$pid" ] ; do

答案 1 :(得分:0)

问题:前导零

您正在使用Bourne样式的外壳,该外壳将数字的前导零解释为算术表达式中的八进制表示法。如果前导零的数字实际上不是八进制数字,则shell对象(“非法数字”)

$ n=077
$ echo $(( n ))
63
$ n=088
$ echo $(( n ))
sh: Illegal number: 088

如果您的/bin/shbash,则错误消息略有不同:

bash: 088: value too great for base (error token is "088")

每当您的日期分钟变量($M)或秒变量($SE)碰巧以前导零开头,后跟数字8或9时,执行此行时都会出现此错误Shell脚本中的算术运算:

DURATION=$(((60 - M) * 60-SE))

解决前导零问题

由于您的数字是时间,因此永远不会为负,并且只会有一个前导零,因此可以在替换变量时使shell去除单个前导零:

$ M=08
$ SE=09
$ DURATION=$(((60 - M) * 60-SE))
sh: Illegal number: 08
$ DURATION=$(((60 - ${M#0}) * 60-${SE#0}))
$ echo $DURATION
3111

如果您的/bin/sh实际上是bash,则可以改用10#语法(但请注意,这不适用于其他/bin/sh外壳,例如{{1 }}用于Ubuntu,也不适用于负数,但适用于多个前导零):

dash

对于适用于所有Bourne风格的shell且具有任意数量的前导零,带有正数或负数的通用解决方案,您必须避免执行shell算术运算,而求助于外部程序,例如旧版$ DURATION=$(((60 - 10#$M) * 60-10#$SE))

expr

我认为$ DURATION=$( expr \( 60 - $M \) \* 60 - $SE ) 以前是在shell进行算术处理之前内置于shell的,但是exprbash都没有内置,因此,确实需要对外部程序dash的调用,因此比shell内置算法慢几个数量级。在循环使用时要小心。

在Stack Overflow上还有其他与此类似的问题,但是每个问题的答案只包含一半的真相,并且答案并不适用于所有Bourne shell变体中的所有数字。我认为以上答案总结了所有可能的情况。