sed && awk 第二章runsed代码理解

Posted uxiuxi

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sed && awk 第二章runsed代码理解相关的知识,希望对你有一定的参考价值。

#! /bin/sh
  2 for x
  3 do
  4     echo "editing $x: \c"
  5 #    if test "$x"=sedscr; then
  6  #       echo "not editing sedscript!"
  7     if [ "$x" = "sedscr" ];then
  8          echo "bi not editing sedscript!"
  9     elif test -s $x;then
 10         echo "x exist "
 11         sed -f sedscr $x > /tmp/$x$$
 12         if test -s /tmp/$x$$
 13             then
 14             if cmp -s $x /tmp/$x$$
 15             then
 16                 echo "file not changed:\c"
 17             else
 18                 mv $x $x.bak
 19                 cp /tmp/$x$$ $x
 20             fi
 21             echo "done"
 22         else
 23             echo "sed produced an empty file\c"
 24             echo " - check your sedscript."
 25         fi
 26         rm -f /tmp/$x$$
 27     else
 28         echo "original file is empty."
 29     fi

这个代码有三个地方不理解,现在终于理解了

1.for x

  当时不了解这种结构,后面google,找到一个文档。http://www.thegeekstuff.com/2011/07/bash-for-loop-examples/?utm_source=feedburner。 就是for 不接 in的时候,自动会将位置变量 存入到其中

3. Don’t specify the list; get it from the positional parameters

If you don’t specify the keyword “in” followed by any list of values in the bash for loop, it will use the positional parameters (i.e the arguments that are passed to the shell script).

$ cat for3.sh
i=1
for day
do
 echo "Weekday $((i++)) : $day"
done

$ ./for3.sh Mon Tue Wed Thu Fri
Weekday 1 : Mon
Weekday 2 : Tue
Weekday 3 : Wed
Weekday 4 : Thu
Weekday 5 : Fri

Caution: Please be careful if you use this method. You should not include the keyword “in” in the for loop. If you leave the keyword “in” without any values, it will not use the positional parameter as shown below. It will not go inside the loop. i.e for loop will never get executed as shown in the example below.

$ cat for3-wrong.sh
i=1
for day in
do
 echo "Weekday $((i++)) : $day"
done

$ ./for3-wrong.sh Mon Tue Wed Thu Fri


2.第二点在自己linux上敲的时候,代码逻辑跟想的不一样。后面才发现 shell 中 [ $a = ‘abcd‘ ] 有严格空格要求,中间只能用=号,跟python 混淆了。在变量跟括号之间要各有空格。 在变量与变量之间也要有空格,可以参考https://stackoverflow.com/questions/4277665/how-do-i-compare-two-string-variables-in-an-if-statement-in-bash

以上是关于sed && awk 第二章runsed代码理解的主要内容,如果未能解决你的问题,请参考以下文章

sed && awk

Sed&awk笔记之awk

sed & awk 概述

sed && awk lookup 解答

sed && awk工具 及一些经常使用的shell脚本

L-1-23 awk&sed