脚本无法展开星号(`*`)

脚本无法展开星号(`*`)

我有一个每小时收集 nmon 数据的脚本:

#!/bin/bash
# olympics_yymmdd_HHMM.nmon
time_stamp=`date +"%y%m%d"`
h_name="$HOSTNAME"
exec > /var/log/nmon_capture.log
n_name=$h_name"_"$time_stamp"_*.nmon"
n_dir="/var/log/nmon_data"
cd $n_dir
sleep 1m
pwd
ls -al $n_name
#
/usr/bin/nmon -f -t -s 60 -c 1440 -m $n_dir
gzip $n_name
ls -al
exit

调试输出显示列表文件存在问题。然而,这在其他服务器上运行良好。

# bash -x /usr/bin/nmon_capture 
++ date +%y%m%d 
+ time_stamp=170217 
+ h_name=olympics 
+ exec 
+ n_name='olympics_170217_*.nmon' 
+ n_dir=/var/log/nmon_data 
+ cd /var/log/nmon_data 
+ sleep 1m 
+ pwd 
+ ls -al 'olympics_170217_*.nmon' 
ls: cannot access olympics_170217_*.nmon: No such file or directory 
+ /usr/bin/nmon -f -t -s 60 -c 1440 -m /var/log/nmon_data 
+ gzip olympics_170217_1504.nmon 
+ ls -al 
+ exit 

答案1

当您进行分配时,右侧被视为引用:

n_name=$h_name"_"$time_stamp"_*.nmon"

因此,星号 ( *) 将逐字包含在变量中。
它不会像通常在路径中带有星号那样扩展。

由于目录中可能没有带星号的文件,因此找不到该文件,并且 会发出错误ls


另外,如果您确实希望星号扩展起作用,则应该在应找到该文件的目录中完成:

a_dir=/dir_to_file
n_name=$(echo "${a_dir}/${h_name}_${time_stamp}_"*".nmon")    
n_dir="/var/log/nmon_data"
cd "$n_dir"

而且,使用 shell 选项是一个非常好的主意nullglob

shopt -s nullglob

以避免*在没有具有该名称的文件时保留 。

或者,更好的是使用该选项failglob

shopt -s failglob

当找不到文件时发出明确的错误。

a_dir=/dir_to_file
n_name=$(shopt -s failglob; echo "$a_dir/${h_name}_${time_stamp}_"*".nmon")
(( $? )) && exit 1

根据您的需要调整“$n_dir”的值(从您对问题的描述中不清楚)。

并且请:默认引用您的扩展,例如:ls -al "$n_name"

相关内容