我正在努力寻找某种方式来以其他方式表达这一点,以产生适当的输出:
var="$(ls /var/run/ | grep searchterm | awk {'NR == 2'})"
我曾在诸如 shellcheck 之类的地方看到过使用 glob 或循环,但我迄今为止的研究还没有想出任何方法可以做到这一点,以便我可以将结果作为变量来获取,而不仅仅是回显或打印内容。
有什么方法可以做到这一点?
答案1
var="$( find /var/run -iregex "$YOUR_REGEX" 2> /dev/null )"
当然,man find
要了解-iregex
选项的一些局限性。
如果搜索词不太复杂,您可以使用-iname "*$SEARCHTERM*"
。
一般来说,解析输出ls
是您真正应该避免的事情。
答案2
如果你的情况
目录中有四个文件 — 其中三个有静态名称(例如,
red
和blue
)green
,一个没有。但我知道第四个foo
文件的名称中会有 。我想获取第四个文件名。显然,我可以安全地搜索foo
,因为没有一个静态名称包含foo
。
那么你需要做的就是
var="$(echo /var/run/*foo*)"
如果你只是在当前目录中工作,并且你确实
var="$(echo *foo*)"
第四个文件名可能以-
(破折号),上述命令可能会失败。(此外,如果文件名可能包含(反斜杠),上述任一命令都可能失败\
。)但是
var="$(printf '%s' *foo*)"
或者
var="$(printf '%s' /var/run/*foo*)"
应该管用。
当然,如果第四个文件名以.
(点),你还有另一个问题。