为什么 BashFAQ #50 不建议使用 eval? [重复]

问题描述 投票:0回答:1

根据https://mywiki.wooledge.org/BashFAQ/050 ...将 bash 命令放入 shell 变量中以便随后执行是一个非常糟糕的主意。

但是以下有什么不好呢?

#!/bin/bash

cmd="for i in \$(seq 3); do echo 'a' 'b  c' 'd' \$i | tr '[a-z]' '[A-Z]'; done"

eval "$cmd"

它似乎工作得很好,甚至保留了空格,允许 for 循环并允许管道。

当然它没那么快,但是 bash 真的与速度有关吗?

bash
1个回答
1
投票

很多事情都不好。它很难阅读(并且编辑器不会对其进行语法突出显示),难以重用,难以安全修改(一旦引入外部变量,这必然会发生)。

cmd() {
  local -ar tokens=(a 'b  c' d)
  for ((i = 0; i < 3; ++i)); do
    echo "${tokens[@]^^}" "$i"
  done
}

cmd
© www.soinside.com 2019 - 2024. All rights reserved.