linux - Bash 混合 for 循环和 if then 表达式给出不好的结果

标签 linux bash shell if-statement for-loop

我是 linux shell 和脚本的初学者,在执行此操作时我得到了一些奇怪的结果

#!/bin/bash

sysarch=( "x86" "amd64" )

arch_options=""
for i in "${sysarch[@]}"
do
    :
    if [ $i=="amd64" ]; then
        arch_options="-m64 -D ACIS64"
    elif [ $i=="x86" ]; then
        arch_options="-m32"
    fi
    echo $arch_options
done

exec $SHELL

因此,我有一个包含两种架构类型的数组。我遍历它们,我想为每个选项获取相应的 GCC 选项。问题是 $arch_options 始终是 "-m64 -D ACIS64",与 $i 无关,我不明白为什么。

最佳答案

就像你说的,它每次都打印相同的值:

$ ./foo
-m64 -D ACIS64
-m64 -D ACIS64

让我们看一下:

$ shellcheck foo
In foo line 9:
    if [ $i=="amd64" ]; then
         ^-- SC2077: You need spaces around the comparison operator.

In foo line 11:
    elif [ $i=="x86" ]; then
           ^-- SC2077: You need spaces around the comparison operator.

In foo line 17:    
exec $SHELL
     ^-- SC2086: Double quote to prevent globbing and word splitting.

并解决问题:

#!/bin/bash

sysarch=( "x86" "amd64" )

arch_options=""
for i in "${sysarch[@]}"
do
    :
    if [ $i == "amd64" ]; then
        arch_options="-m64 -D ACIS64"
    elif [ $i == "x86" ]; then
        arch_options="-m32"
    fi
    echo $arch_options
done

exec "$SHELL"

瞧:

$ ./foo
-m32
-m64 -D ACIS64

关于linux - Bash 混合 for 循环和 if then 表达式给出不好的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22425805/

相关文章:

linux - 无法使用参数运行外部工具

linux - 如何在 bash shell 中使用管道?

linux - 多个 PID 存储在 PID 文件中

linux - Sed - 按最后两个字符计算行数

linux -/usr/bin/find : Argument list too long, 在尝试删除 164850 个文件时得到这个

linux - 比较一组词的出现

windows - Mkdir 与 "-p"标志结合

bash - 如何在 bash 中的 grep 中指定命令行参数?

php - 在 Linux 中的 php 中显式超时文件读取 I/O 操作?

php - 以编程方式从 systemd 的日志中读取消息