使用变量传递参数给scanimage时--source参数报错求助
解决scanimage脚本变量传递--source参数报错的问题
报错信息:
scanimage: setting of option --source failed (Invalid argument)
问题原因
这是因为变量赋值和展开时的引号处理错误导致的。在报错的脚本里:
Source='--source="ADF Duplex"'
外层单引号把--source="ADF Duplex"整个当成了字符串,当你用$Source展开时,bash会按空格把它拆成--source="ADF和Duplex"两个参数传给scanimage。而且这里的引号会被当作普通字符传递,不是用来包裹空格的分隔符,导致scanimage无法识别正确的扫描源参数。
而直接在命令里写--source="ADF Duplex"时,bash会正确解析引号,把ADF Duplex作为一个整体传递给--source选项,所以能正常运行。
解决方案
方案1:用数组存参数(推荐)
bash数组能完美处理带空格的命令参数,每个选项或参数单独作为数组元素:
#!/bin/bash Source=(--source="ADF Duplex") Device="canon_dr:libusb:001:011" scanimage -d "$Device" "${Source[@]}" > test.tiff
展开数组时用"${Source[@]}",能保证每个元素作为独立参数传递,不会被空格拆分。
方案2:拆分选项和参数值
把选项名和参数值分开存储,调用时分别传递:
#!/bin/bash SourceValue="ADF Duplex" Device="canon_dr:libusb:001:011" scanimage -d "$Device" --source="$SourceValue" > test.tiff
这种方式逻辑清晰,也不容易出错。
方案3:用eval解析(不推荐)
如果一定要把整个选项存在变量里,可以用eval强制解析引号,但eval有安全风险,不建议在生产脚本中使用:
#!/bin/bash Source='--source="ADF Duplex"' Device="canon_dr:libusb:001:011" eval scanimage -d "$Device" "$Source" > test.tiff
内容的提问来源于stack exchange,提问作者Ilyasha
相关产品推荐
相关产品推荐

