将 find 的结果保存为 shell 脚本中的变量

将 find 的结果保存为 shell 脚本中的变量

我想找到一个文件的路径,并将该输出保存到 shell 脚本中的变量中。具体来说,在 bash shell 中,如果我写

GCC_VERSION="find *-gcc"

然后

echo ${GCC_VERSION}

印刷

find some-gcc

如何让变量GCC_VERSION只保存 的输出find?也就是说,如何将find *-gcc命令的输出保存到变量中GCC_VERSION,以便

echo ${GCC_VERSION}

印刷

some-gcc

答案1

首先,你的find命令是错误的。如果你想在当前目录中查找所有以 结尾的文件,-gcc则应该是:

$ find . -type f -name "*-gcc"

保存输出find使用GCC_VERSIONprocess substitution

$ GCC_VERSION=$(find . -type f -name "*-gcc")

请注意,您可能有多个以 结尾的文件,-gcc因此将变量名括在双引号中:

$ echo "$GCC_VERSION"
./mipsel-linux-gnu-gcc
./aarch64-linux-gnu-gcc
./mips-linux-gnu-gcc
./arm-linux-gnueabihf-gcc

答案2

您需要使用反引号

VARIABLE=`Command`

或者更好的推荐新式命令替换语法

VARIABLE=$(Command)

虽然两种形式都受支持,但前者嵌入脚本有限制。

引自开放群组基础规范第 7 期,2018 年版

命令替换的“$()”形式解决了使用反引号时行为不一致的问题。例如:

                Command               Output
                echo '\$x'              \$x
                echo `echo '\$x'`       $x
                echo $(echo '\$x')      \$x

此外,反引号语法对嵌入命令的内容有历史限制。虽然较新的“$()”形式可以处理任何类型的有效嵌入脚本,但反引号形式无法处理包含反引号的某些有效脚本。例如,这些原本有效的嵌入脚本在左列中不起作用,但在右列中起作用:

echo `                        echo $(
cat <<\eof                    cat <<\eof 
a here-doc with `             a here-doc with )
eof                           eof
`                             )

... 引用结束。

相关内容