shell中的测试条件
test expression       #test 1 -gt 2
[ expression ] #[ 1 -gt 2 ]
` expression `      #` 1 -gt 2 `
这三个表达的结果是一样,1是否大于2。
 
整数测试语法:
-gt 大于———————— [ 1 -gt 2 ] 意思为测试1是否大于2,返回值$?为1(假),1不大于2
-lt 小于———————— [ 1 -lt 2 ] 意思为测试1是否小于2,返回值$?为0(真),1小于2
-le 小于等于—————— [ 1 -le 2 ] 意思为测试1是否小于或等于2,返回值$?为0(真),1小于2
-ge 大于等于
-eq 等于
-ne 不等于
也可以用>表示-gt但是必须在(())中用,比如((1 > 2)),或是(($a > $b))
                >=表示-ge
       <=表示-le
        =表示-eq
 
字符串测试语法:
= 等于
!= 不等于
> 大于
< 小于
-z zero意思是字符串必须为0,为0就为真否则为假,
-n 意思是字符串是否为空(null),为空就为假,不为空才是真。
 
文件测试:
-e FILE 测试一个文件是否存在
-f FILE 测试一个文件是否为普通文件
-d FILE 测试一个文件是否为目录
-r FILE   测试一个文件是否可读
-w FILE                   是否可写
-x   FILE                   是否可执行
-L/-h FILE 测试一个文件是否为符号链接文件
-O FIEL 测试一个文件属主是否为你
-G FILE                    属组是否为你
 
 
-a 与
-o  
! 非
a=1
b=2
c=3
[ $b -gt $a -a $b -gt $c ] 意思为$b是否大于$a并且$b是否大于$c,两个条件都要满足
 
[ $b -gt $a -o $b -gt $c ] 意思为$b是否大于$a或者$b是否大于$c,两个条件只要有一个满足就可以
 
[ ! $b -gt $a ]意思为$b是否不大于$a,但根据上面已制定的值来看$b是大于$a的所以结果为1(假)
上面为短路操作符,意思为只要一半结果也可以决定整个语句的执行方式,
 
&& 与
所连接的是两个完整的语句比如[$b -gt $a ] && [ $b -gt $c ],如果用这种凡是表达则只有前面的执行结果为真了才执行后面的语句,比如语句[ 2 -gt 3 ] && echo "2 is max nub" ,语句的执行结果为不会显示echo后面的话,因为2不大于3。
 
||  
所连接的也是两个完整的语句比如[ 2 -gt 3 ] || echo "3 is max nub" ,此语法执行的结果是会显示echo后面的话,因为2不大于3结果为假,并不能说明整个语句都为假,所以一定会执行3 is max nub。
 
&&和||也可以一起用例如 cut -d: -f1 /etc/passwd | grep "^root" >> /dev/null && echo "root is have " || echo "root is not have "这个语句意思为搜索一下名字为root的用户,如果有这个用户则显示root is have,如果没有就显示root is not have。
 
 cut -d: -f1 /etc/passwd | grep "^root" >> /dev/null意思为以:为分割取第一个冒号之前的内容并用grep查找root开头的字串并把显示结果丢弃,只取命令返回值。
 
 
实例:[ $b -gt $a ] && echo " $b is max nub" ||echo "$a is max nub"意思为如果$b为最大数则显示$b为最大数,反之显示$a为最大数。
 
实例1:也可以用脚本中的位置变量实现,比如在脚本max.sh中写:
#!/bin/bash
 
[ $1 -gt $2 ] && echo "$1 is max nub" || echo "$2 is max nub"
 
执行脚本的时候在后面加$1和$2的值 ./max.sh 5 6 就会显示6 is max nub。
 
 
 
diff/patch
 
diff 比较两个文件的不同并可以生成一个补丁文件
patch 可以打补丁
 
diff file1 file2 可以比较file1和file2的不同(form file to file),file2为源文件file1为目标文件。也可以反向补,diff file1 file2 > file3.patch 生成一个补丁文件。
patch file1 < file3.patch打补丁。再用diff file1 file2比较两个文件内容就一样了。
如果patch file2 < file3.patch则会提示报错为降级,但也可以进行
patch -R file1 < file3.patch 意思为返回打补丁之前的状态
 
diff -u file1 file2 使用统一格式显示两个文件的不同。
diff dir1 dir2 也可以比较两个目录(实为比较两个目录下的文件),
 
diff dir1 dir2 > dir3/
cd dir1
patch -p1 < ../dir3/ p1的意思是省去第一个斜杠后面的多余路径来进行比较。p2省去第二个之前。
 
 
aspell check filename 检查文件中是否有单词语法错误(是以linux中内置的词典去检查的)
look命令可以查看linux词典中的单词,look head 可以查看以hea开头的单词
 
tr 'a-z' 'A-Z' 把第一个中出现的字符换成第二个里面的
cat /etc/passwd | tr 'a-z' 'A-Z' 把passwd中所有的单词换成大写
cat /etc/passwd | tr 'abc' ' '     吧passwd中所有的abc换成空格
 
sed  
(stram editor)流编辑器,如果把文件送给它,它会一行一行的编辑。
1,非交互式,只要给他一个命令就不需要在参与了,
2,没有破坏性,不修改原文件,只是把文件读到内存中在内存中修改。也可以使用shell重定向符来修改文件。使用sed -i 参数直接更改源文件。
3,sed还支持sed脚本。
/只是一个分隔符也可用其他字符代替,比如@或是?。任何符号都可以用只要跟要查找的内容中包括的符号不一样的。
sed '/root/p' /etc/passwd 显示passwd文件中包含root字符的行(p为命令选项print为显示的意思)
sed '/root/d' /etc/passwd 把包含root的行删除,d命令选项为删除。
sed 's/root/ROOT/' /etc/passwd 搜索包含root的行 把root换成ROOT。默认只替换行中的第一个。
sed 's/root/ROOT/g' /etc/passwd 替换所有root为ROOT,g参数表示全局。
sed 's/root/ROOT/i' /etc/passwd   忽略大小写替换root。
sed 's/r..oot/ROOT/' /etc/passwd 可以使用同表达式,搜索包含r(中间包含任意两个字符)oot替换成ROOT
 
sed '1,5s/root/ROOT/g' /etc/passwd 替换1——5行的内容,1,5表示指定行范围(也可以用10,$是从第10行到最后一行)。
 
sed '/root/,/ftp/s/root/ROOT/' /etc/passwd 意思为从第一个以root开始的行到第一个出现ftp的行结束来替换。
 
sed '/root/a \bbb' FILE 在所有以root开头的行后面一行插入一行bbb
sed '/root/i \bbb' FILE 在所有以root开头的行前面一行插入一行bbb
sed '/root/i \bbb \nccc' FILE 在所有以root开头的行前面一行插入一行bbb和一行ccc,\n表示换行符。
 
 
sed -e 's/root/ROOT' -e 's/abc/ABC' FILE 可以一次执行两个条件参数。-e连接两个条件或多个条件同时用在一个文件上。
 
sed -f sed.txt FILE sed还支持从一个文件中读取条件
 
#vim sed.txt
 
s/root/ROOT/
s/ABC/abc/
 
:wq
一行一个条件不需要加引号('')
sed -f sed.txt FILE 即可从sed.txt中读取已创建好的条件。
 
 
if语句
单分支语句
if []; then
       …..
       …..
fi
单分支语句是只有一个条件的时候执行,比如
if [ $1 –gt $2 ]; then              如果$1大于$2则
       echo “$1 is max nub.”                 显示echo后面的话
fi                                                      fi结束符
上面的语句如果测试条件未成立则不会执行then后面的语句,这就是单分支语句。
--------------------------------------------------------------
双分支语句
if    []; then
   ………
       ……..
else
       …….
……...
fi
 
双分支语句则是当条件满足时执行什么,不满足时执行什么。
比如:
if [ $1 –gt $2 ]; then              如果$1大于$2则
       echo “$1 is max nub.”                 显示echo后面的话
else
       echo “$2 is max nub                如果$1不大于$2,则会显示这个echo下面的话
fi                                                      结束符
 
双分支语句多了一个else,这种语句可以有两种执行结果,一种为条件满足时的执行,一种为条件不满足时的执行。
--------------------------------------------------------------------
多分枝语句
 
if   []; then
       ….
       ….
elif []; then
       ….
       ….
elif []; then
       ….
       ….
else
       …..
fi
 
       另外if语句也可以嵌套if语句,比如
if [ -e $1 ]; then                 先判断文件是否存在
       if [ -f $1 ]; then                     再判断文件是否为普通文件
       echo “$1 is common file.”            如果存在又是普通文件则显示echo
 elif [ -d $1 ]; then                           判断是否为目录
       echo “$1 is a directory.”               如果是目录则显示
   else                                             
       echo “$1 is unkown.”                  如果存在但不是普通文件和目录则显示echo
     fi
else
       echo “please gave me a correct file.”    如果文件不存在则显示echo
   exit    6                   这里是明确指定脚本退出,可以跟一个数字表明错误代码
fi                                                             脚本结束
 
---------------------------------------------------------
 
循环语句
for 语句,for是在制定的条件下循环,比如
 let sum=0
for I in 1 2 3 4 5 6 7 8 9 10; then    $i会在in后面制定的已知的条件里面循环
        let sum+=$I
done
       echo “sum is $sum”
 
while语句,可以循环未知的条件。
 
while [ ]; do
              .......
done
比如:
let i=0                               给i赋值
let sum=0                                                        给sum赋值
while [ $i –ge 100 ]; do                              当$i小于100的时候
   sum+=$i                                             执行sum等于自己加$i
       let i++                                               让i自己加1,只到大于100的时候退出循环  
done
----------------------------------------------------------
 
until循环,正好与while相反,当条件不满足时循环,满足条件了则不循环
until [ ]; do
 .......
Fone
常用的特殊变量
$$当前进程的进程号,通常为shell的进程号
$?命令执行的返回值
$* 把所有出入进来的参数变成一个参数
$@ 把所有输入进来的参数变成每个单独的参数
$# 显示输入进来参数的个数
$!最近打开在后台运行的进程的进程号
$0表示命令或脚本本身,脚本后面的是$1和$2,但命令本身用$0来引用