我想将表达式的结果(即命令的输出)分配给变量,然后对其进行操作-例如,将其与字符串连接,然后回显它。这是我得到的:
#!/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
列出文件及其日期,并使用sort
和read
(此处假定bash
或zsh
用于-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] 删除。
我来说两句