如何将命令的输出分配给shell变量?

内森·G。

我想将表达式的结果(即命令的输出)分配给变量,然后对其进行操作-例如,将其与字符串连接,然后回显它。这是我得到的:

#!/bin/bash
cd ~/Desktop;
thefile= ls -t -U | grep -m 1 "Screen Shot";
echo "Most recent screenshot is: "$thefile;

但是输出:

Screen Shot 2011-07-03 at 1.55.43 PM.png
Most recent screenshot is: 

因此,它似乎没有分配给$thefile,而是在执行时被打印。

我想念什么?

吉勒斯“别再邪恶了”

外壳程序分配是一个单词,等号后没有空格。因此,您写的内容为分配了一个空值thefile此外,由于分配是与命令组合在一起的,因此它会生成thefile一个环境变量,并且该分配对于该特定命令而言是本地的,即,只有调用才能ls看到分配的值。

您要捕获命令的输出,因此需要使用命令替换

thefile=$(ls -t -U | grep -m 1 "Screen Shot")

(一些文献显示了另一种语法thefile=`ls …` ;反引号语法等效于美元括号语法,除了有时引号内的引用很奇怪,因此只需使用即可$(…)。)

有关脚本的其他说明:

  • -t(按时间排序)与-U(不与GNU排序ls)结合起来是没有道理的;只是使用-t

  • 与其grep用于匹配屏幕截图,不如将通配符传递给ls并用于head捕获第一个文件,这一点更加清晰

      thefile=$(ls -td -- *"Screen Shot"* | head -n 1)
    
  • 解析输出ls通常是一个坏主意如果文件名带有不可打印的字符,则可能会严重失败。但是,ls如果没有则很难按日期对文件进行排序,因此,如果您知道文件名中没有不可打印的字符或反斜杠,那么这是一个可以接受的解决方案。

  • 始终在变量替换周围使用双引号,即在这里写

      echo "Most recent screenshot is: $thefile"
    

    如果没有双引号,则变量的值会重新扩展,如果它包含空格或其他特殊字符,则会引起麻烦。

  • 您不需要在行尾使用分号。它们是多余的,但无害。

  • 在shell脚本中,通常包含一个是一个好主意set -e这告诉外壳程序如果有任何命令失败(通过返回非零状态)则退出。

如果您具有GNUfind并且sort(尤其是如果您正在运行非嵌入式Linux或Cygwin),则可以使用另一种方法来查找最新文件:find列出文件及其日期,并使用sortread(此处假定bashzsh用于-d ''读取NUL分隔的记录)以提取最年轻的文件。

IFS=/ read -rd '' ignored thefile < <(
  find -maxdepth 1 -type f -name "*Screen Shot*" -printf "%T@/%p\0" |
    sort -rnz)

如果您愿意用zsh而不是bash编写此脚本,则有一种更简便的方法来捕获最新文件,因为zsh具有glob限定符,这些限定符不仅允许名称上的通配符匹配,还允许文件元数据上的通配符匹配。(om[1])该模式之后的部分是水珠限定符; om根据年龄的增加对比赛进行排序(即,按照修改时间,最新的优先),并[1]仅提取第一个比赛。整个匹配项都需要放在括号中,因为从技术上讲,它是一个数组,因为遍历会返回文件列表,即使这[1]意味着在此特定情况下该列表最多包含一个文件。

#!/bin/zsh
set -e
cd ~/Desktop
thefile=(*"Screen Shot"*(om[1]))
print -r "Most recent screenshot is: $thefile"

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

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

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

如何将命令的输出分配给Makefile变量

如何将Bash命令的输出分配给变量?

如何将 shell 命令的输出分配给所有 make 目标的 Makefile 变量?

如何将此命令的输出分配给Shell中的变量?

如何将计算输出分配给Shell变量

使用tee时如何将多个外壳命令的输出分配给变量?

如何将包含 ` ` 的命令分配给 bash shell 脚本中的变量?

如何将日期分配给shell变量?

将jps -vl命令的输出分配给shell脚本中的变量

将 memcache 命令的输出分配给 shell/bash 脚本中的变量

如何在检查命令是否成功的同时将命令的输出分配给变量?

无法将命令输出分配给变量

重击:将命令组的输出分配给变量

无法将linux命令输出分配给变量

将命令输出分配给变量(BASH)

将命令输出分配给bash中的变量

如何将敏感输出变量的值分配给环境变量?

在使用“ ls”命令以及将输出分配给变量时,如何抑制stderr?

如何将数组输出分配给逻辑应用程序变量?

Liquid:如何将运算符的输出分配给变量?

我如何将makefile函数的输出分配给变量

如何将值从vardump输出分配给php中的变量?

如何将变量分配给python中的特定函数输出?

如何将BIML变量分配给BIMLScript变量?

如何将php变量分配给JS变量

如何将php变量分配给javascript变量

Discord.js 如何将发送命令的人分配给变量

Jenkins 声明式管道 - 如何将表达式分配给 shell 变量

如何将选择语句从Oracle分配给Shell变量