【问题标题】:Read filename with * shell bash使用 * shell bash 读取文件名
【发布时间】:2015-02-20 14:38:27
【问题描述】:

我是 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 缺乏了解,我找不到它。那么有人能告诉我哪里出了问题吗?

谢谢!一月

【问题讨论】:

  • /home/led/LED* 扩展到 /home/led/LED 的所有匹配项。因此,例如,如果您说ls /home/led/LED*,您将得到所有这些(在您的情况下是一个)。我会调试说var=/home/led/LED*。然后echo $var 确认它正在正确扩展。
  • a=/home/led/LED* LedV=$(basename $a) echo $LedV 不能在同一行工作。试试看:a=/home/led/LED* LedV=$(basename $a); echo "$LedV"

标签: linux bash shell variables filenames


【解决方案1】:

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

varname=foo*

"$varname" 的扩展实际上是"foo*"。当您认为echo $varname(或者在您的情况下为basename $varname;无论哪种方式都没有双引号)将导致 扩展 本身被视为一个全局时,这会更加令人困惑,所以您可能会认为该变量包含所有这些文件名。

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

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##*/}"

【讨论】:

  • 您好,很抱歉回复晚了,但周末不在。
  • fspec=( /path/LED* ) echo "${fspec[0]##*/}"
  • "${fspec##*/}" 有效,但问题是 fspec 读取路径名但现在记住 /path/LED* 而不是例如 /path/LED5.5.345。
  • 正如你所提到的,他们确实没有在标量分配上使用 LED* 的选项。感谢您的帮助,我将尝试找到一个已知的选项!
【解决方案2】:
pwd
/usr/local/src

ls -1 /usr/local/src/mysql*
    /usr/local/src/mysql-cluster-gpl-7.3.4-linux-glibc2.5-x86_64.tar.gz
    /usr/local/src/mysql-dump_test_all_dbs.sql

如果你只有 1 个文件,你只会得到 1 个结果

MyFile=`ls -1 /home/led/LED*`

【讨论】:

    猜你喜欢
    • 2012-05-01
    • 2011-06-26
    • 1970-01-01
    • 2020-05-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-10
    相关资源
    最近更新 更多