使用Unix shell测试系统的字节序

4
我是一名有用的助手,可以为您翻译文本。以下是您需要翻译的内容:

我对shell脚本非常陌生(实际上是我的第一天),我正在使用它来创建一个可移植的C代码,以便在我的其中一个课程中使用。我想定义一个CPP指令,该指令将定义我正在编译的系统的字节序(无论是Solaris、BSD、Linux、OSX等)。但我遇到了一些困难。

我当前脚本的关键是以下行:

printf '\1' | od -dAn;

这个代码可以输出小端模式下的 1,大端模式下的256(我在所有系统上都测试过,看起来很好用)。

但是,当我把它加到下面的脚本中时,它似乎不能正常工作。

CONFIG_HRD="config.h"
ENDIAN=printf '\1' | od -dAn;

touch $CONFIG_HRD
if $ENDIAN -eq \1; then
    echo "#define LITTLE_ENDIAN" >> $CONFIG_HRD
else
    echo "#define BIG_ENDIAN" >> $CONFIG_HRD
fi

它会出现如下错误:
./script.sh: line 2: \1: command not found
./script.sh: line 5: -eq: command not found

我希望有人能告诉我我做错了什么。谢谢。
====== 编辑======= 以下代码现在产生以下错误:
CONFIG_HRD="config.h"
ENDIAN=$(printf '\1' | od -dAn)

touch $CONFIG_HRD
if `$ENDIAN -eq 1`; then
    echo "#define LITTLE_ENDIAN" >> $CONFIG_HRD
else
    echo "#define BIG_ENDIAN" >> $CONFIG_HRD
fi

这个错误:

./script.sh: line 5: 1: command not found

这段代码会导致以下错误:
CONFIG_HRD="config.h"
ENDIAN=$(printf '\1' | od -dAn)

touch $CONFIG_HRD
if `$ENDIAN=1`; then
    echo "#define LITTLE_ENDIAN" >> $CONFIG_HRD
else
    echo "#define BIG_ENDIAN" >> $CONFIG_HRD
fi

错误:

./script.sh: line 5: 1=1: command not found

这个(方括号而不是引号)会导致另一个错误:

CONFIG_HRD="config.h"
ENDIAN=$(printf '\1' | od -dAn)

touch $CONFIG_HRD
if [$ENDIAN=1]; then
    echo "#define LITTLE_ENDIAN" >> $CONFIG_HRD
else
    echo "#define BIG_ENDIAN" >> $CONFIG_HRD
fi

错误:

./script.sh: line 5: [: missing `]'

你考虑过使用Autoconf(https://www.gnu.org/software/autoconf/)吗?它是专门为此类事情设计的,并生成一个shell脚本作为最终产品。 - NPE
1
那是下一个作业,但这个任务的重点是学会在没有的情况下如何应对。 - audiFanatic
相关:https://serverfault.com/questions/163487/how-to-tell-if-a-linux-system-is-big-endian-or-little-endian - Ciro Santilli OurBigBook.com
1个回答

6

尝试:

ENDIAN=$(printf '\1' | od -dAn)

或(使用反引号)
ENDIAN=`printf '\1' | od -dAn`

将结果存储到 var 变量中。

取决于您使用的 shell,if 语句的语法也会有所不同。

if [ $ENDIAN -eq 1 ]; then

太好了,这解决了一个问题。然而,在第5行我仍然遇到另一个问题,即“1”被视为命令。我将更新原帖并附上我的编辑后的脚本代码。 - audiFanatic
我已经尝试过使用“-eq”和“=”两种方式,结果相同。 - audiFanatic
尝试使用 if [ "$ENDIAN" -eq 1 ]; then 这个语句。在调试过程中,可以在脚本开头加上 #!/bin/bash -vx 来获取完整的跟踪信息。 - Basile Starynkevitch
这里适用 [ $ENDIAN -eq 1 ],你使用了方括号吗?在你的帖子中使用了重音符号。 - PeterMmm
1
你必须保留空格。 - PeterMmm
啊,搞定了。谢谢。 - audiFanatic

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接