非法号码 - 外壳脚本



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

./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

更改此内容

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

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

问题:前导零

您使用的是 Bourne 风格的 shell,它将数字的前导零解释为算术表达式中的八进制表示法。 如果带有前导零的数字实际上不是八进制数字,则 shell 对象("非法数字"),例如

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

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

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 shell,例如 Ubuntu 上使用的dash,也不适用于负数,但它确实适用于多个前导零):

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

对于适用于所有 Bourne 风格的 shell 的通用解决方案,具有任意数量的前导零,正数或负数,您必须避免 shell 算术并求助于外部程序,例如遗留expr

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

我认为expr在 shell 有自己的算术处理之前就内置在 shell 中,但bashdash今天都没有内置它,所以它确实需要调用外部程序expr(1)因此比 shell 内置算术慢几个数量级。 在循环中使用它时要小心。

在 Stack Overflow 上还有其他类似的问题,但它们中的每一个在答案中只有一半的真实性,并且答案不适用于所有 Bourne shell 变体中的所有数字。 我认为我上面的回答总结了所有可能的情况。

最新更新