读取文件中的行并避免使用带有Bash的行

nix*_*win 20 bash comments loops

我试过这个:

file="myfile"
while read -r line
do
    [[ $line = \#* ]] && continue
    "address=\$line\127.0.0.1"
done < "$file"
Run Code Online (Sandbox Code Playgroud)

此代码不会避免以注释开头的行.即使我没有任何评论,也dnsmasq告诉我有错误.

它将成为一个dnsmasqconf文件,它将读取和插入域名,如下所示:address=\mydomain.com\127.0.0.1.


编辑:1

输入文件:

domain1.com
domain2.com
domain3.com
#domain4.com
domain5.com
Run Code Online (Sandbox Code Playgroud)

输出应该是:

address=/domain1.com/127.0.0.1
address=/domain2.com/127.0.0.1
address=/domain3.com/127.0.0.1
address=/domain5.com/127.0.0.1
Run Code Online (Sandbox Code Playgroud)

我将脚本放在/etc/dnsmasq.d/目录中,以便dnsmaq.conf可以在dnsmasq启动时处理它.

Kei*_*son 29

要跳过以下列开头的#:

grep -v '^#' myfile | while read -r file ; do
    ...
done
Run Code Online (Sandbox Code Playgroud)

grep根据需要修改命令,例如,跳过以空格和#字符开头的行.

  • downvoter会关心解释吗?(不这么认为.) (3认同)

ДМИ*_*КОВ 18

它使用起来更安全 [[ "$line" = "\#*" ]]

顺便说一句, address="\\${line}\\127.0.0.1"

UPD:

如果我理解你,你需要将每个未注释的域名更改为address=\domain\127.0.0.1.它可以快速简单地完成sed,在bash程序中没有必要.

$> cat ./text
domain1.com
domain2.com
domain3.com
#domain4.com
domain5.com

$> sed -r -e 's/(^[^#]*$)/address=\/\1\/127.0.0.1/g' ./text2
address=/domain1.com/127.0.0.1
address=/domain2.com/127.0.0.1
address=/domain3.com/127.0.0.1
#domain4.com
address=/domain5.com/127.0.0.1
Run Code Online (Sandbox Code Playgroud)

如果你需要删除注释行,sed也可以使用 /matched_line/d

$> sed -r -e 's/(^[^#]*$)/address=\/\1\/127.0.0.1/g; /^#.*$/d' ./text2 
address=/domain1.com/127.0.0.1
address=/domain2.com/127.0.0.1
address=/domain3.com/127.0.0.1
address=/domain5.com/127.0.0.1
Run Code Online (Sandbox Code Playgroud)

UPD2:如果你想在bash脚本中做所有的事情,这里是你的代码修改:

file="./text2"
while read -r line; do
    [[ "$line" =~ ^#.*$ ]] && continue
    echo "address=/${line}/127.0.0.1"
done < "$file"
Run Code Online (Sandbox Code Playgroud)

它的输出:

address=/domain1.com/127.0.0.1
address=/domain2.com/127.0.0.1
address=/domain3.com/127.0.0.1
address=/domain5.com/127.0.0.1
Run Code Online (Sandbox Code Playgroud)


bri*_*urg 6

注释行可以并且经常以空格开头。这是一个 bash 原生正则表达式解决方案,可以处理任何前面的空格;

while read line; do
  [[ "$line" =~ ^[[:space:]]*# ]] && continue
  ...work with valid line...
done
Run Code Online (Sandbox Code Playgroud)


Pip*_*ipo 5

只有一个为我工作的是:

while IFS=$'\n' read line
do  
    if [[ "$line" =~ \#.* ]];then
        logDebug "comment line:$line"
    else
        logDebug "normal line:$line"
    fi
done < myFile
Run Code Online (Sandbox Code Playgroud)


JoJ*_*man 5

[ "${line:0:1}" = "#" ] && continue
Run Code Online (Sandbox Code Playgroud)

这需要字符串,在偏移量 0处获取子字符串,长度为 1

"${line:0:1}"
Run Code Online (Sandbox Code Playgroud)

并检查它是否等于 #

= "#"
Run Code Online (Sandbox Code Playgroud)

并继续循环如果是这样

&& continue
Run Code Online (Sandbox Code Playgroud)

http://www.tldp.org/LDP/abs/html/string-manipulation.html