Linux Bash新手求助:脚本出现(standard_in) 1: syntax error错误
解决你的Bash脚本
(standard_in) 1: syntax error问题 嘿,我来帮你搞定这个报错!你遇到的(standard_in) 1: syntax error是bc命令闹的脾气,咱们来掰扯清楚原因和修复办法。
错误根源
你的脚本里,xxd -p -l1 -s $counter merge.bmp输出的是十六进制字符串(比如0a、ff这类),但你直接把它丢给echo "obase=16; $var" | bc的时候,bc默认会把输入当成十进制数字解析。如果var是a、f这种十六进制专属字符,bc会把它们当成未定义的变量,直接就报语法错误了。
另外,你脚本里的if-else分支完全重复,只是$var前后多了个空格,这部分根本没必要分情况;还有开头的file_data=$(<merge.bmp)完全没用到,留着反而占内存,尤其是处理大文件的时候。
修复方案
根据你的需求,分两种情况给你修正:
情况1:你只是想获取字节的十六进制字符串
既然xxd已经直接输出十六进制了,完全不需要用bc多此一举:
#!/bin/bash counter=0 touch file1.bmp touch file2.bmp while [ $counter -lt 10 ]; do # 直接拿到十六进制字符串 hex_var=$(xxd -p -l1 -s $counter merge.bmp) # 这里可以加你后续要处理hex_var的逻辑,比如写入文件 ((counter++)) # 更简洁的自增写法 done echo "DONE!"
情况2:你需要先获取字节的十进制值,再转成十六进制
如果你的目标是先拿到字节的十进制数值,再转成十六进制,那换用od命令读取十进制值就不会报错了:
#!/bin/bash counter=0 touch file1.bmp touch file2.bmp while [ $counter -lt 10 ]; do # 用od获取字节的十进制值 var=$(od -An -tu1 -j $counter -N1 merge.bmp) # 转成十六进制,这次var是十进制数字,bc能正常解析 hex_var=$(echo "obase=16; $var" | bc) # 后续处理逻辑 ((counter++)) done echo "DONE!"
额外小提示
- 处理二进制文件的时候,尽量避免用普通的文本读取命令,
xxd和od是更靠谱的工具。 - 循环里的条件判断可以用
((counter < 10))替代[ $counter -lt 10 ],写法更直观。
内容的提问来源于stack exchange,提问作者user8097385
相关产品推荐
相关产品推荐

