如果要运行变量中指定的命令并将输出保存在另一个变量中,可以使用以下命令。command="find something" output=$($command) 或者,如果要将输出存储在数组中: typeset -a output=$($command) 但是,将文件名存储在变量中,然后试图访问具有这些文件名的文件是一个坏主意,因为不可能设置正确的分隔符来分隔文件名,因为文件名可以包含除NUL之外的任何字符(请参见https://mywiki.wooledge.org/BashPitfalls)。 我不知道你想做什么,但是你的find命令包含一个错误。-exec选项必须以;来指示-exec参数的结束。除此之外,它似乎是“xy问题”参见https://xyproblem.info/如果你想获得扩展名为.ctrf或.rbc的常规文件的基本名称,请使用下面的bash脚本。 for x in **/*.+(ctrf|rbc); do basename $x ; done或zsh脚本 basename **/*.(ctrf|rbc)(#q.) 请确保您已经在shell中启用了“extendedglob”选项。要在bash中启用它,请运行以下命令。shopt -s extglob对于zsh,请运行setopt extendedglob
4条答案
按热度按时间cyvaqqii1#
最佳实践:接受数组,而不是字符串
首先,您的shell脚本应该将运行命令 * 作为一系列独立的参数 *,而不是单个参数。
称为:
请注意,没有必要使用外部
basename
命令:find -printf
只能直接打印文件名。后备:将字符串正确解析为数组
如果您必须接受一个字符串,那么可以使用Reading quoted/escaped arguments correctly from a string中的答案将该字符串安全地转换为数组。
我们可以使用
xargs
,它牺牲了shell的完全兼容性以避免使用非标准工具:...脚本名为:
e4eetjau2#
如果要运行变量中指定的命令并将输出保存在另一个变量中,可以使用以下命令。
command="find something" output=$($command)
或者,如果要将输出存储在数组中:
typeset -a output=$($command)
但是,将文件名存储在变量中,然后试图访问具有这些文件名的文件是一个坏主意,因为不可能设置正确的分隔符来分隔文件名,因为文件名可以包含除NUL之外的任何字符(请参见https://mywiki.wooledge.org/BashPitfalls)。
我不知道你想做什么,但是你的find命令包含一个错误。-exec选项必须以;来指示-exec参数的结束。除此之外,它似乎是“xy问题”参见https://xyproblem.info/如果你想获得扩展名为.ctrf或.rbc的常规文件的基本名称,请使用下面的bash脚本。
for x in **/*.+(ctrf|rbc); do basename $x ; done
或zsh脚本basename **/*.(ctrf|rbc)(#q.)
请确保您已经在shell中启用了“extendedglob”选项。要在bash中启用它,请运行以下命令。
shopt -s extglob
对于zsh,请运行setopt extendedglob
f5emj3cl3#
对于Find_Command,应使用数组而不是字符串:
第二个语句假设文件名中没有特殊字符(如空格)。
xzabzqsa4#
使用
eval
:注意保持参数的清洁和安全。