当前位置: 首页 > 面试题库 >

Bash中的eval命令及其典型用法

贺善
2023-03-14
问题内容

在阅读了bash手册页并针对此帖子之后。

我仍然很难理解该eval命令的确切功能以及它的典型用法。例如,如果我们这样做:

bash$ set -- one two three  # sets $1 $2 $3
bash$ echo $1
one
bash$ n=1
bash$ echo ${$n}       ## First attempt to echo $1 using brackets fails
bash: ${$n}: bad substitution
bash$ echo $($n)       ## Second attempt to echo $1 using parentheses fails
bash: 1: command not found
bash$ eval echo \${$n} ## Third attempt to echo $1 using 'eval' succeeds
one

这里到底发生了什么,美元符号和反斜杠如何与问题联系在一起?


问题答案:

eval将字符串作为其参数,并对其进行求值,就好像您在命令行上键入了该字符串一样。(如果您传递几个参数,则它们首先会以空格隔开。)

${$n}是bash中的语法错误。在大括号内,您只能具有一个变量名,并带有一些可能的前缀和后缀,但是您不能具有任意的bash语法,尤其是不能使用变量扩展。尽管有这样一种说法:“名称在此变量中的变量的值”:

echo ${!n}
one

$(…)在子外壳程序(即在一个单独的进程中,该命令在圆括号内)中运行,该命令继承了当前外壳程序的所有设置(例如变量值),并收集其输出。因此echo $($n)$n作为shell命令运行,并显示其输出。由于$n计算为1,因此$($n)尝试运行该命令1,该命令不存在。

eval echo \${$n}运行传递给的参数eval。展开后,参数为echo${1}。因此eval echo \${$n}运行命令echo ${1}

请注意,大部分的时间,你必须用双引号周围的变量替换和命令替换(即随时有一个$"$foo", "$(foo)"
始终在变量和命令替换两边加上双引号
,除非您知道需要将其省略。没有双引号,外壳程序将执行字段拆分(即,它将变量的值或命令的输出拆分为单独的单词),然后将每个单词视为通配符模式。例如:

$ ls
file1 file2 otherfile
$ set -- 'f* *'
$ echo "$1"
f* *
$ echo $1
file1 file2 file1 file2 otherfile
$ n=1
$ eval echo \${$n}
file1 file2 file1 file2 otherfile
$eval echo \"\${$n}\"
f* *
$ echo "${!n}"
f* *

eval不经常使用。在某些Shell中,最常见的用法是获取变量的值,该变量的名称直到运行时才知道。在bash中,由于${!VAR}语法原因,这不是必需的。eval当您需要构建包含运算符,保留字等的较长命令时,它仍然很有用。



 类似资料:
  • 其他常用命令 编辑 hosts 文件:vim /etc/hosts,添加内容格式:127.0.0.1 www.youmeek.com RPM 文件操作命令: 安装 rpm -i example.rpm,安装 example.rpm 包 rpm -iv example.rpm,安装 example.rpm 包并在安装过程中显示正在安装的文件信息 rpm -ivh example.rpm,安装 exa

  • 基础常用命令 某个命令 --h,对这个命令进行解释 某个命令 --help,解释这个命令(更详细) man某个命令,文档式解释这个命令(更更详细)(执行该命令后,还可以按/+关键字进行查询结果的搜索) Ctrl + c,结束命令 TAB键,自动补全命令(按一次自动补全,连续按两次,提示所有以输入开头字母的所有命令) 键盘上下键,输入临近的历史命令 history,查看所有的历史命令 Ctrl +

  • 所有的, 请指导我,如何在dos窗口中打印下面命令的o/p?由于不熟悉dos命令,我不知道下面的字符串是什么意思? 提前谢谢

  • 我正在尝试用docker容器中的一个表建立一个数据库。为了正确运行数据库,我需要运行以下命令: bash:--:无效选项db_1用法:bash[GNU long option][option]... db_1 bash[GNU long option][option]脚本-文件... db_1 GNU long options: db_1--debugg db_1--debugger\ 如果“ba

  • 问题内容: Infile1: Infile2: 我如何使用unix join命令加入这些文件以获取以下输出: Dogbanes答案有效,但是…当我在此文件上应用Dogbanes答案时: 和这个: 他们不加入: 第二种情况是制表符分隔的,所以我用 问题答案: 首先两个文件。然后使用联接两个文件的第一个字段。如果要删除空间并转换为,则还需要通过管道传递输出。如下所示: