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

bre*_*att 12 command-line find

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

GCC_VERSION="find *-gcc"
Run Code Online (Sandbox Code Playgroud)

然后

echo ${GCC_VERSION}
Run Code Online (Sandbox Code Playgroud)

印刷

find some-gcc
Run Code Online (Sandbox Code Playgroud)

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

echo ${GCC_VERSION}
Run Code Online (Sandbox Code Playgroud)

印刷

some-gcc
Run Code Online (Sandbox Code Playgroud)

Ark*_*zyk 21

首先,您的find命令不正确。如果要查找以-gcc当前目录结尾的所有文件,它应该是:

$ find . -type f -name "*-gcc"
Run Code Online (Sandbox Code Playgroud)

要保存findGCC_VERSION使用的输出process substitution

$ GCC_VERSION=$(find . -type f -name "*-gcc")
Run Code Online (Sandbox Code Playgroud)

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

$ echo "$GCC_VERSION"
./mipsel-linux-gnu-gcc
./aarch64-linux-gnu-gcc
./mips-linux-gnu-gcc
./arm-linux-gnueabihf-gcc
Run Code Online (Sandbox Code Playgroud)


var*_*ona 5

您需要使用反勾号

VARIABLE=`Command`
Run Code Online (Sandbox Code Playgroud)

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

VARIABLE=$(Command)
Run Code Online (Sandbox Code Playgroud)

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

引用自The Open Group Base Specifications Issue 7, 2018 版

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

                Command               Output
                echo '\$x'              \$x
                echo `echo '\$x'`       $x
                echo $(echo '\$x')      \$x
Run Code Online (Sandbox Code Playgroud)

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

echo `                        echo $(
cat <<\eof                    cat <<\eof 
a here-doc with `             a here-doc with )
eof                           eof
`                             )
Run Code Online (Sandbox Code Playgroud)

...报价结束。

  • 反引号被认为已弃用,取而代之的是`$(...)` 命令替换语法。 (5认同)