我有一个每小时收集 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"