在bash中使用if语句的问题

时间:2015-03-15 10:45:01

标签: bash if-statement

我对if声明有疑问。在WEDI_RC中保存的日志文件格式如下:

name_of_file date number_of_starts

我想比较第一个参数$1和第一列,如果它是真的而不是增量的起始数。当我启动我的脚本时它可以工作但只有一个文件,例如

file1.c 11:23:07 1                  
file1.c 11:23:14 2  
file1.c 11:23:17 3  
file1.c 11:23:22 4  
file2.c 11:23:28 1  
file2.c 11:23:35 2  
file2.c 11:24:10 3  
file2.c 11:24:40 4  
file2.c 11:24:53 5  
file1.c 11:25:13 1  
file1.c 11:25:49 2  
file2.c 11:26:01 1  
file2.c 11:28:12 2

每当我更改文件时,它都从1开始计数。我需要在结束时继续计数。

希望你理解我。

while read -r line      
do
    echo "line:"
    echo $line
    if [ "$1"="$($line | grep ^$1)" ]; then
        number=$(echo $line | grep $1 | awk -F'[ ]' '{print $3}')
    else 
        echo "error"
    fi
done < $WEDI_RC

echo "file"
((number++))
echo $1 `date +"%T"` $number >> $WEDI_RC

2 个答案:

答案 0 :(得分:1)

我没有得到你想要用你的测试[ "$1"="$($line | grep ^$1)" ]完成的东西,但似乎你正在检查该行是从第一个参数开始的。

如果是这样,我认为你可以:

  • 为grep提供-o选项,以便只打印匹配的输出(所以$1
  • 使用[[ "$line" =~ ^"$1" ]]作为测试。

答案 1 :(得分:1)

至少有两种方法可以解决问题。最简洁的可能是:

echo "$1 $(date +"%T") $(($(grep -c "^$1 " "$WEDI_RC") + 1))" >> "$WEDI_RC"

但是,如果你想分别对每个文件进行计数,你可以使用关联数组,假设你有Bash版本4.x(例如Mac OS X上提供的不是3.x)。此代码假定文件格式正确(以便每次文件名更改时计数不会重置为1)。

declare -A files                       # Associative array
while read -r file time count          # Split line into three variables    
do
    echo "line: $file $time $count"    # One echo - not two
    files[$file]="$count"              # Record the current maximum for file
done < "$WEDI_RC"

echo "$1 $(date +"%T") $(( ${files[$1]} + 1 ))" >> "$WEDI_RC"

代码使用read将行拆分为三个单独的变量。它回应它读取的内容并记录当前的计数。循环完成后,它会回显要追加到文件的数据。如果该文件是新文件(尚未在文件中提及),那么您将获得1

如果您需要处理损坏的文件作为输入,那么您可以修改代码以计算文件的条目数,而不是信任count值。递增变量时,(( … ))操作中使用的裸阵列引用符号是必需的;你不能将${array[sub]}++与增量(或减量)运算符一起使用,因为它的计算结果是数组元素的值,而不是它的名字!

declare -A files                       # Associative array
while read -r file time count          # Split line into three variables    
do
    echo "line: $file $time $count"    # One echo - not two
    ((files[$file]++))                 # Count the occurrences of file
done < "$WEDI_RC"

echo "$1 $(date +"%T") $(( ${files[$1]} + 1 ))" >> "$WEDI_RC"

您甚至可以检测格式是破碎还是固定格式:

declare -A files                       # Associative array
while read -r file time count          # Split line into three variables    
do
    echo "line: $file $time $count"    # One echo - not two
    if [ $((files[$file]++)) != "$count" ]
    then echo "$0: warning - count out of sync: ${files[$file]} vs $count" >&2
    fi
done < "$WEDI_RC"

echo "$1 $(date +"%T") $(( ${files[$1]} + 1 ))" >> "$WEDI_RC"