Bash 查找文件名并设置为变量

Dre*_*rew 2 bash

我想在我的服务器上的文件夹中找到文件的名称并将其设置为一个变量以供以后使用。问题是当我运行备份脚本时,文件名每次都会更改以补偿日期。所以我不能只是硬编码文件名和路径。

例如,我知道文件的位置 - /var/backups/"unknownfilename.sql"

 backuppath="/var/backups/"
Run Code Online (Sandbox Code Playgroud)

如何将 $backupfile 设置为 $backuppath 中的文件?

经过研究,我只能找到人们回显文件名的位置,他们永远不会将它们存储到变量中。

Cha*_*ffy 7

对于 bash ( #!/bin/bash):

backuppath=/var/backups
sqlfiles=( "$backuppath"/*.sql )
[[ -e $sqlfiles ]] || { echo "Matched no files" >&2; exit 1; }
Run Code Online (Sandbox Code Playgroud)

如果你想参考第一场比赛:

echo "The first match found was: $sqlfiles"
Run Code Online (Sandbox Code Playgroud)

如果要引用所有数组内容:

echo "Found the following files:"
printf '- %q\n' "${sqlfiles[@]}"
Run Code Online (Sandbox Code Playgroud)

对于 POSIX sh ( #!/bin/sh) :

backuppath=/var/backups

# wrap in a function to avoid overwriting the global $1, $2, etc.
find_files() {
  set -- "$backuppath"/*.sql
  [ -e "$1" ] || { echo "Matched no files" >&2; exit 1; }
  [ "$#" -gt 1 ] && echo "WARNING: Matched $# files; only taking first" >&2
  sqlfile=$1
}
find_files
Run Code Online (Sandbox Code Playgroud)

注意事项:

  • 扩展本身 ( "$backuppath") 应该在引号内;glob 表达式 ( *.sql) 不应该。
  • 测试找到的第一个元素是否存在([[ -e $sqlfiles ]]在 bash 中,[ -e "$1" ]在 POSIX sh 版本中)可以防止不存在匹配项时的默认行为,结果将使用 glob 表达式本身 ( /var/backups/*.sql);在测试是否存在时,除非存在具有该名称的文件(也就是说,包含星号的名称),否则不会出现该名称。
  • 第一种形式使用 bash 中存在的两种行为(您标记问题的外壳),但不使用/bin/sh:数组和扩展 ( [[ ]]) 测试运算符。如果您要使用标准测试命令,则[ -e "$sqlfiles" ]改为;如果您要在没有数组的 shell 中操作,您可以将此逻辑包装在一个函数中并用于set -- "$backuppath"/*.sql将结果放入类似数组的 object 中"$@",之后您可以将第一个匹配项引用为"$1",或者将完整的匹配项集引用为"$@"。