#! /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://*.com/questions/4277665/how-do-i-compare-two-string-variables-in-an-if-statement-in-bash