Shellcheck.net认为此代码很好,但是当我尝试在bash中运行它时,它在第10行(“ .s”)上返回语法错误,并带有意外的操作数 是什么意思?
#! /bin/bash
date_on_file=$(date +%Y%m%d%H%M)
ref_mnth=$(echo "$date_on_file"|awk '{print substr($1,5,2)}')
ref_day=$(echo "$date_on_file"|awk '{print substr($1,7,2)}')
for file in *
do
mnth=$(echo "$file"|awk '{print substr($1,5,2)}')
day=$(echo "$file"|awk '{print substr($1,7,2)}')
if [[ $((mnth)) -lt $((ref_mnth)) ]] && [[ $((day)) -lt $((ref_day)) ]];then
rm "$file"
fi
done
答案 0 :(得分:2)
总结所有技巧,这是脚本的替代版本:
#!/bin/bash
read -a ref_date <<< $(date +"%Y %m %d %H %M")
ref_month=${ref_date[1]}
ref_day=${ref_date[2]}
for file in *; do
month=${file:5:2}
day=${file:7:2}
if ((month < ref_month && day < ref_day)); then
rm "$file"
fi
done
还有另一种使用bash正则表达式和match运算符在ref_date
上获取字段的方法:
#!/bin/bash
[[ $(date +'%Y%m%d%H%M') =~ ^(....)(..)(..)(..)(..) ]]
ref_month=${BASH_REMATCH[2]}
ref_day=${BASH_REMATCH[3]}
for file in *; do
if [[ $file =~ ^(....)(..)(..)(..)(..) ]]; then
month=${BASH_REMATCH[2]}
day=${BASH_REMATCH[3]}
if ((month < ref_month && day < ref_day)); then
rm "$file"
fi
fi
done
对正则表达式的优化不是故意的,只是为了清楚说明我要匹配和分组的内容。
答案 1 :(得分:1)
尝试使用bash -x运行脚本
bash -x yourscript.sh
您可能会发现它停在带有特殊字符(例如点或逗号)的字符串上。
您的脚本有点混乱,很难说出它的实际作用,但是在执行之前
if [[ $((mnth)) -lt $((ref_mnth)) ]] && [[ $((day)) -lt $((ref_day)) ]];then
您首先应该验证变量是否具有要比较的整数值,因为-lt仅适用于数字形式。
您可能想添加一些东西来调试它,例如:
(...) echo "[debug] $((mnth)) $((ref_mnth)) $((day)) $((ref_day))" if [[ $((mnth)) -lt $((ref_mnth)) ]] && [[ $((day)) -lt $((ref_day)) ]];then (...)
此外,我不确定您为什么对变量使用双括号,因为它们用于算术运算,而您似乎不对它们执行此类运算。
答案 2 :(得分:1)
这里还有一个值得担心的因素:8月和9月,当月份为“ 08”和“ 09”时
$ mnth=04
$ ref_mnth=08
$ if ((mnth < ref_mnth)); then echo ok; fi
bash: ((: 08: value too great for base (error token is "08")
$ if [[ $mnth -lt $ref_mnth ]]; then echo ok; fi
bash: [[: 08: value too great for base (error token is "08")
您必须执行一些字符串操作以删除前导零,或者明确告诉bash这些是以10为底的数字,而不是八进制
$ if ((10#$mnth < 10#$ref_mnth)); then echo ok; fi
ok
$ if [[ 10#$mnth -lt 10#$ref_mnth ]]; then echo ok; fi
ok