【发布时间】:2016-10-07 07:17:23
【问题描述】:
我有一个 bash 脚本,它可以在我的系统中正确运行:
uname -a
Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2 (2016-04-08) x86_64 GNU/Linux
但我需要它在 Redhat 7.2 chroot 中工作:
Linux debian 3.16.0-4-amd64 #1 SMP Debian 3.16.7-ckt25-2 (2016-04-08) x86_64 unknown
相同的代码在第一个代码上正确执行,但是当它首先在 7.2 上运行时,它不能识别 sed -i(只是 -i 参数)。评论一些行会遇到另一个问题:
bash: command substitution: line 1: syntax error near unexpected token `<<<'
问题是,这个脚本需要在带有 debian 7.2 的远程机器上执行(这就是为什么我要在具有相同发行版的 chroot 中测试它),所以安装模块/升级是没有解决方案的它可以运行。
示例代码:
#!/bin/bash
...
count=0
while read line; do
if echo "$line" | grep -q ')'
then
((count++))
comas=`grep -o "," <<< "$line" | wc -l`
num=`grep -o "byRef" <<< "$line" | wc -l`
...
sed -i 's/shortInteger/int/g' "test.h"
有什么想法吗?
谢谢。
编辑: 这些是给我带来麻烦的命令:
comas=`grep -o ","
sed -i 's/shortInteger/int/g' "test.h"
编辑 2:
GNU bash,版本 2.05.8 -->“这里的字符串”(
grep (GNU grep) 2.4.2 --> -o 选项不存在
GNU sed 3.02 版 --> -i 选项不存在
【问题讨论】:
-
如果您在代码中指出错误的行号,那么您需要显示完整的脚本,否则它是无用的。
-
@Inian 代码太长,这里就不贴了,为了保护代码隐私,我应该改很多字。在示例中,我指出了引发错误的两行。我将编辑帖子以使其脱颖而出。
-
第一行可以改为:
comas=`printf '%s' "$line" | grep -o "," | wc -l`。对于第二个:每个 sed 的版本是什么(来自您的系统和来自 7.2 chroot? -
对于 grep 行,最好试试
comas=$(echo "$line" | grep -c ",")和num=$(echo "$line" | grep -c "byRef")。 grep 的 -c 选项由 POSIX 定义,应该适用于较旧的 grep。 -
旧的 sed 3.02 手册似乎没有
-i选项(就地编辑)。您将需要使用临时文件。试试看:sed 's/shortInteger/int/g' "test.h" > test.temp.h; mv "test.temp.h" "test.h"