如果文档中尚不存在行,则将其添加到文档中

时间:2016-06-30 20:47:43

标签: bash

我想说,如果文档不存在,那么创建文档。接下来阅读文档的每一行,如果没有一行与$site/$name变量匹配,则将$site/$name变量添加到文档中。

#!/bin/bash

site=http://example.com
doc=$HOME/myfile.txt 

if [ ! -f $doc ] 
then 
    touch $doc
fi 

read -p "name? " name 

while read lines
do 
    if [[ $lines != $site/$name ]]
    then 
        echo $site/$name >> $doc
    fi
done <$doc 

echo $doc
echo $site
echo $name
echo $site/$name
echo $lines

read -p提示符下键入测试结果

path/to/myfile.txt
http://example.com
test
http://example.com/test

我觉得我应该知道这一点,但我只是没有看到它。我做错了什么?

2 个答案:

答案 0 :(得分:2)

如果文件最初为空,则永远不会进入循环,因此永远不会添加该行。如果文件为空,则无论如何都要为每个不匹配的行添加一行。试试这个:设置一个标志来指示是否添加该行,然后通读该文件。如果找到匹配的行,请清除该标记以防止在循环后添加行。

do_it=true
while read lines
do 
    if [[ $lines = $site/$name ]]
    then 
        do_it=false
        break
    fi
done < "$doc"
if [[ $do_it = true ]]; then
    echo "$site/$name" >> "$doc"
fi

答案 1 :(得分:2)

如果文件不存在,以下内容将创建该文件。然后检查它是否包含$site/$name。如果找不到,则将字符串添加到文件末尾:

#!/bin/bash
site=http://example.com
doc=$HOME/myfile.txt
read -p "name? " name
touch "$doc"
grep -q "$site/$name" "$doc" || echo "$site/$name" >>"$doc"

如何运作

  • touch "$doc"

    如果文件不存在,则创建该文件。如果它确实存在,则运行此命令的唯一副作用是更新文件的时间戳。

  • grep -q "$site/$name" || echo "$site/$name" >>"$doc"

    如果grep命令找到字符串,则将其退出代码设置为true。如果找不到它,那么“or”子句(在shell中,||表示逻辑 - 或)被触发,echo命令将字符串添加到文件末尾。