bash-传递变量以查找命令-exec

b_pcakes

我有一个像这样的脚本:

#!/usr/bin/env bash

OLD_PATH_BASE=./components/
NEW_PATH_BASE=../../../react_components/

find . -regextype sed -regex "\./rockstart_\w\+_app/static/js/\w\+\.js" -exec sed -i "s@^\(import \w\+ from '\)$OLD_PATH_BASE\(\w\+/\w\+\.jsx';\)@\1$NEW_PATH_BASE\2@" {} \;

这按我的预期工作,但是当我这样做时:

#!/usr/bin/env bash

OLD_PATH_BASE=./components/
NEW_PATH_BASE=../../../react_components/

SED_COMMAND='sed -i "s@^\(import \w\+ from '"'\)$OLD_PATH_BASE\(\w\+/\w\+\.jsx';\)@\1$NEW_PATH_BASE\2@"'"'
find . -regextype sed -regex "\./rockstart_\w\+_app/static/js/\w\+\.js" -exec $SED_COMMAND {} \;

它不起作用,并给我错误:

sed: -e expression #1, char 1: unknown command: `"'

即使当我echo $SED_COMMAND,它显示正确的命令。怎么了

查尔斯·达菲

数组将起作用:

#!/usr/bin/env bash

old_path_base=./components/
new_path_base=../../../react_components/

# this is totally unnecessary, but IMHO makes your code easier to read
# ...huge long lines being unweildy by nature, after all.
sed_pieces=(
   's'
   "^\(import \w\+ from '\)${old_path_base}\(\w\+/\w\+\.jsx';\)"
   "\1${new_path_base}\2"
   '' # flags; empty set
)

# ...using an array for sed_command is the important part:
IFS='@' # this makes "${array[*]}" combine pieces with @s
sed_command=( sed -i "${sed_pieces[*]}" )

find . -regextype sed \
  -regex "\./rockstart_\w\+_app/static/js/\w\+\.js" \
  -exec "${sed_command[@]}" {} +

解释:

  • 扩展无引号的字符串(如您的失败尝试)不会通过完整的解析器运行扩展结果,而是仅通过字符串拆分和glob扩展阶段运行;因此,报价不会被解析和使用。这是一个功能,而不是错误-如果每个扩展都运行完整的解析器,则实际上无法在shell中编写安全代码。请阅读BashFAQ#50,以获取对当前行为的完整解释以及最佳实践的变通方法。

    为了提供一个简短,简单的示例:

    a_command='touch "hello world"'
    $a_command
    

    ...实际上将创建两个文件:一个名为"hello,一个名为world"这是因为唯一的处理步骤$a_command是字符串拆分(基于空格拆分为单词)和全局扩展(评估该拆分过程创建的每个项目,以查看其是否为全局表达式,然后将其替换为匹配文件列表)如果是这样)。

  • -exec ... {} +将多个输入文件名传递给exec'd命令的每次调用因此,它是在允许的情况下提高效率的方式(这里肯定是这种情况,因为任何sed支持-i扩展的文件也将支持多个输入文件)。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

exec命令bin bash

来自分类Dev

bash:-exec在find命令中和&

来自分类Dev

为bash exec构造命令

来自分类Dev

Bash:查找和复制 exec 命令不是递归的

来自分类Dev

通过exec在查找的输出上进行Bash变量替换

来自分类Dev

Linux -Bash 查找、-exec 和 sed

来自分类Dev

bash循环中的exec命令用于webscrapping

来自分类Dev

在bash中玩日期:传递变量

来自分类Dev

Bash:您如何传递变量?

来自分类Dev

bash shell传递变量和引号

来自分类Dev

在传递到sudo bash时传递变量

来自分类Dev

将所有bash函数的参数传递给docker exec命令吗?

来自分类Dev

在Ubuntu Server上的Bash:查找:`-exec'缺少参数

来自分类Dev

exec和tee到日志文件:解释这些bash命令

来自分类Dev

在bash`-exec命令{} +`中+是什么意思?

来自分类Dev

嵌套的bash命令在teamcity ssh exec中不起作用

来自分类Dev

来自bash的exec $ SHELL

来自分类Dev

Bash脚本-exec语法

来自分类Dev

bash exec的正确语法

来自分类Dev

来自bash的exec $ SHELL

来自分类Dev

在正则表达式中传递变量(bash)

来自分类Dev

在Bash脚本中传递变量名称和值

来自分类Dev

Bash提供选项并在选择时传递变量

来自分类Dev

Bash中的cURL-在单引号之间传递变量

来自分类Dev

bash与psql结合使用,在它们之间传递变量

来自分类Dev

在 Bash 中两次传递变量

来自分类Dev

单个Gradle Exec任务中的多个bash命令与多个Gradle Exec任务中的每个命令具有单个命令

来自分类Dev

如何在Linux(ubuntu)中从bash脚本运行exec bash命令?

来自分类Dev

如何在python的exec_command中传递变量值?