前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >在shell脚本中,如何将一个命令存储在一个变量中

在shell脚本中,如何将一个命令存储在一个变量中

作者头像
程序熵
发布2024-06-18 14:44:18
1480
发布2024-06-18 14:44:18
举报
文章被收录于专栏:技术汇

问题

我想将一个命令保存到一个变量中,以便稍后再使用(不是命令的输出,而是命令本身)。

我有一个简单的脚本如下:

代码语言:javascript
复制
command="ls";
echo "Command: $command"; #Output is: Command: ls

b=`$command`;
echo $b; #Output is: public_html REV test... (command worked successfully)

然而,当我尝试一些更复杂的东西时,它失败了。例如,如果我做

代码语言:javascript
复制
command="ls | grep -c '^'";

输出为:

代码语言:javascript
复制
Command: ls | grep -c '^'
ls: cannot access |: No such file or directory
ls: cannot access grep: No such file or directory
ls: cannot access '^': No such file or directory

我如何将这样(带有管道/多个命令)的命令存储在变量中以供以后使用?


回答

对于带有管道或重定向的组合命令最推荐的方式是将其封装到一个函数里,然后在需要时直接调用即可。

对于命令 ls | grep -c '^' 可以写为如下形式:

代码语言:javascript
复制
func1() {
    ls | grep -c '^'
}

cd /path/to/work

# when need
func1

如果需要将 func1 写为一行,则代码如下:

代码语言:javascript
复制
func1() {  ls | grep -c '^'; }

这里需要在 {} 里面命令的末尾加上分号 ;

一个高赞回答是使用 eval,代码如下:

代码语言:javascript
复制
x="ls | wc"
eval "$x"
y=$(eval "$x")
echo "$y"

但是其中 eval 是一个非常容易引发错误的内置命令,在没有警告用户可能存在不可预料的解析行为风险的情况下,不应推荐使用它。使用 eval 命令时需要非常小心,因为它可以使得代码可读性较差并且容易引入安全漏洞。朋友们有踩到过 eval 命令的坑吗,可以在评论区留言交流一下。


参考

  • stackoverflow question 5615717
  • help eval
本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2024-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序熵 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 问题
  • 回答
  • 参考
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档