我一直在尝试计算具有特定前缀的所有文件,然后如果带有前缀的文件数与数字5不匹配,我想打印前缀。
为实现这一目标,我编写了以下bash脚本:
#!/bin/bash
for filename in $(ls); do
name=$(echo $filename | cut -f 1 -d '.')
num=$(ls $name* | wc -l)
if [$num != 5]; then
echo $name
fi
done
但我得到了这个错误(反复):
./check_uneven_number.sh: line 5: [1: command not found
谢谢!
答案 0 :(得分:1)
if
语句接受命令,运行它并检查其退出状态。左括号([
)本身就是一个命令,但你写了[$num
。 shell将$num
扩展为1
,创建单词[1
,这不是命令。
if [ $num != 5 ]; then
答案 1 :(得分:0)
您的代码循环文件名,而不是前缀;因此,如果有三个具有特定前缀的文件名,您将收到三个警告,而不是一个。
请改为尝试:
# Avoid pesky ls
printf '%s\n' * |
# Trim to just prefixes
cut -d . -f 1 |
# Reduce to unique
sort -u |
while IFS='' read -r prefix; do
# Pay attention to quoting
num=$(printf . "$prefix"* | wc -c)
# Pay attention to spaces
if [ "$num" -ne 5 ]; then
printf '%s\n' "$prefix"
fi
done
就个人而言,我更喜欢case
而不是笨拙的if
,但这需要一些时间来适应。