linux - 使用 * shell bash 读取文件名

标签 linux bash shell variables filenames

我是 Linux 新手,我想编写一个 bash 脚本,该脚本可以读取以 LED + 一些数字开头的目录的文件名。(例如:LED5.5.002)

在该目录中只有一个以 LED 开头的文件。问题是这个文件每次都会更新,所以下一次会是例如 LED6.5.012 和计数。

我进行了一些搜索和尝试,得出了这个解决方案:

export fspec=/home/led/LED*
LedV=`basename $fspec`
echo $LedV

如果我在我的终端中一个一个地输入这些命令,它工作正常,LedV= LED5.5.002 但如果我在 bash 脚本中运行它,它会给出结果:LedV = LED*

我搜索另一个解决方案:

a=/home/led/LED* LedV=$(basename $a) echo $LedV

但这里又是一样的,如果我一个一个地给出它没关系,但在一个脚本中:LedV = LED*。

它可能很小,但由于我对 Linux 缺乏了解,我无法找到它。那么有人可以告诉我哪里出了问题吗?

谢谢!简

最佳答案

Shell 扩展不会发生在标量赋值上,所以在

varname=foo*

"$varname" 的扩展字面意思是 "foo*"。当您认为 echo $varname(或者在您的情况下 basename $varname;无论哪种方式都没有双引号)会导致扩展 本身被视为一个 glob,因此您可能认为该变量包含所有这些文件名。

数组扩展是另一回事。你可能只是想要

fspec=( /path/LED* )
echo "${fspec[0]##*/}" # A parameter expansion to strip off the dirname

这对 bash 来说效果很好。由于 POSIX sh 没有这样的数组,我想提供一种替代方法:

for fspec in /path/LED*; do
    break
done
echo "${fspec##*/}"

关于linux - 使用 * shell bash 读取文件名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28631518/

相关文章:

linux - 具有少量父设备属性的 udev 规则

linux - 如何在 Linux 中的给定时间窗口内每周运行一天任务?

linux - 当输出文件有字符串时发送电子邮件的 Netcat 脚本

linux - printf 从左侧填充除零以外的数字

svn - Unix命令剥离一行的一部分

shell - hadoop shell命令非常慢

sql - .MDF 数据库的 UnixODBC 驱动程序问题。或 : is there a way to easily extract a bunch of tables without an sql server?

linux - 在 ASM 中显示 64 位寄存器

regex - sed : extract multiple fields in random order

shell - 在 Fish shell 提示符中测试 RETVAL?