我想在服务器上的文件夹中找到文件的名称,并将其设置为变量以便稍后使用。问题是,当我运行备份脚本时,文件名每次都会更改以补偿日期。所以我不能只是硬编码文件名和路径。
例如我知道文件的位置 - /var/backups/"unknownfilename.sql“
backuppath="/var/backups/"
如何在$ backuppath中将$ backupfile设置为文件?
在研究之后,我只能找到人们回显文件名的地方,他们永远不会将它们存储到变量中。
答案 0 :(得分:2)
对于bash(#!/bin/bash
):
backuppath=/var/backups
sqlfiles=( "$backuppath"/*.sql )
[[ -e $sqlfiles ]] || { echo "Matched no files" >&2; exit 1; }
如果你想参考第一场比赛:
echo "The first match found was: $sqlfiles"
如果要引用所有数组内容:
echo "Found the following files:"
printf '- %q\n' "${sqlfiles[@]}"
对于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
注意事项:
"$backuppath"
)应该在引号内; glob表达式(*.sql
)不应该。[[ -e $sqlfiles ]]
,POSIX sh版本中的[ -e "$1" ]
)可防止在不存在匹配时的默认行为,这将使用glob表达式本身({{1 }}) 结果是;当测试存在时,除非文件存在字面上的名称(也就是说,包含星号的名称),否则这将不存在。/var/backups/*.sql
:数组和扩展(/bin/sh
)测试运算符。如果您要使用标准测试命令,那么它将是[[ ]]
;如果你在没有数组的shell中操作,你可以将这个逻辑包装在一个函数中并使用[ -e "$sqlfiles" ]
将结果放入类似数组的对象set -- "$backuppath"/*.sql
中,之后你可以引用第一个匹配作为"$@"
,或完整的匹配项"$1"
。