Linux shell编程学习笔记34:eval 命令

0 前言

在JavaScript语言中,有一个很特别的函数eval,eval函数可以将字符串当做 JavaScript 代码执行,返回表达式或值。

在Linux Shell 中也提供了内建命令eval,它是否具有JavaScript语言中eval函数的功能呢?

1 eval命令的格式、功能和返回值

我们可以使用 help eval命令来查看eval命令的帮助信息。

purpleEndurer @ bash ~ $ ++help eval++

eval: eval arg ...

Execute arguments as a shell command.

Combine ARGs into a single string, use the result as input to the shell,

and execute the resulting commands.

Exit Status:

Returns exit status of command or success if command is null.

1.1 eval命令的格式

eval 参数...

参数说明:参数不限数目,彼此之间用分号分开。

1.2 eval 命令的功能

将参数作为 shell 命令执行。

确切来说,是将参数组合成一个字符串,将结果用作 shell 的输入,并执行生成的命令。

1.3 eval命令的返回值

  • 如果没有参数,eval返回成功(0)。
  • 如果有参数,eval返回参数作为命令执行后的退出状态。

2 eval 命令用法实例

2.1 eval不带参数

purpleEndurer @ bash ~ $ ++eval++

purpleEndurer @ bash ~ ++echo ?++

0

2.2 eval简单回显

purpleEndurer @ bash ~ ++echo 0++

bash

purpleEndurer @ bash ~ ++eval echo 0++

bash

可见 命令 ++eval echo 0++ 和 ++echo 0++ 的功能是一样的。

2.3 利用eval命令执行其它命令

我们把命令 echo hello 赋值给变量c,再用eval命令来这个命令:

purpleEndurer @ bash ~ $ ++c="echo hello"++

purpleEndurer @ bash ~ ++eval c++

hello

2.4 利用eval命令执行函数

我们先定义3个函数a1、a2、a3

bash 复制代码
function a1()
{
	echo a1; #显示 a1
}

function a2()
{
	echo a2; #显示 a2
}

function a3()
{
	echo a3; #显示 a3
}

2.4.1 用for循环调用eval命令来执行它们

purpleEndurer @ bash ~ $ ++function a1(){ echo a1; }; function a2(){ echo a2; }; function a3(){ echo a3; }++

purpleEndurer @ bash ~ ++for i in {1..3}; do eval a{i}; done++

a1

a2

a3

purpleEndurer @ bash ~ $

2.4.2 根据用户输入的数字执行相应的函数

purpleEndurer @ bash ~ $ ++function a1(){ echo a1; }; function a2(){ echo a2; }; function a3(){ echo a3; }++

purpleEndurer @ bash ~ ++echo -n enter 1 or 2 or 3:; read i; eval a{i}++

enter 1 or 2 or 3:1

a1

purpleEndurer @ bash ~ ++echo -n enter 1 or 2 or 3:; read i; eval a{i}++

enter 1 or 2 or 3:3

a3

purpleEndurer @ bash ~ ++echo -n enter 1 or 2 or 3:; read i; eval a{i}++

enter 1 or 2 or 3:4

bash: a4: command not found

purpleEndurer @ bash ~ $

只要我们输入1或2或3,就可以相应地执行a1、a2或a3,输入其它数字则出错。

2.5 在脚本中获取最后一个命令行参数

我们先用cp /dev/stdin a.sh命令创建脚本a.sh,内容如下:

bash 复制代码
echo "\$$#"         
eval echo "\$$#"

purpleEndurer @ bash ~ $ ++cp /dev/stdin a.sh++

echo "\$$#"

eval echo "\$$#"

purpleEndurer @ bash ~ $ ++. a.sh 1 2 3++

$3

3

purpleEndurer @ bash ~ $

我们直接使用命令echo "\$$#",显示出来的是 $3

我们使用eval echo "\$$#",将最后一个参数3正确显示出来了。

相关推荐
寒水馨1 小时前
Linux下载、安装 Codex CLI(附安装包codex-x86_64-unknown-linux-musl.tar.gz)
linux·openai·终端·ai编程·codex·智能体·codex cli
冰封之寂10 小时前
Docker 资源管理终极指南:CPU、内存与 IO 的精细化控制
linux·运维·服务器·docker·云计算
xiaoye-duck10 小时前
《Linux系统编程》Linux 系统多线程(五):<线程同步与互斥>线程互斥(上):从条件变量到生产者消费者模型详解
linux·线程
一叶龙洲12 小时前
向日葵远程Ubuntu,支持隐私屏
linux·运维·ubuntu
酷可达拉斯12 小时前
Linux操作系统-shell编程之Grep与正则表达式
linux·运维·服务器·正则表达式·centos
寒水馨13 小时前
Linux下载、安装llama.cpp-b10068(附安装包llama-b10068-bin-ubuntu-vulkan-x64.tar.gz)
linux·ubuntu·llm·llama·本地部署·llama.cpp·推理引擎
我星期八休息15 小时前
网络编程—UDP与TCP
linux·运维·网络·数据库·网络协议·tcp/ip·udp
ziguo112216 小时前
C/C++ 错误处理全解:从 errno 到 C++ 异常
linux·c语言·c++·windows·visual studio
三84417 小时前
使用Samba/NFS实现文件共享/自动挂载共享目录/autofs自动挂载服务
linux·服务器·网络
高铭杰17 小时前
万物皆可KV(2)SurrealDB 存储布局分析
linux·服务器