shell脚本基础

---恢复内容开始---

  首先学习赵文宇的总结脚本:

1.变量

HOST=$(/bin/hostname)  //将()里的命令执行后的结果赋值给HOST变量
HOST=`/bin/hostname`  //将反引号里面的执行结果赋值给HOST变量


${a}aaa变量a
export a    //将本地变量a变成环境变量在子bash也可用
$PATH    //路径变量 PATH=$PATH:/$HOME/bin 增加路径
$$    //显示当前的进程号
$PPID  // 父进程号
$USER  // 当前用户
$UID    //当前用户的UID
$HOSTNAME   //当前的主机名
$1 $2 $3  $4....  // 要传递的参数
shift   //将参数向前移动一位
$0   //当前的脚本的名称
$#   //要传递参数的个数
${!a}   //间接取变量a值
$@和$*    //所有的位置参数 区别$@最好用双引号$*最好不要用双引号
“$@”     //能包括空行 “$*” 所有的参数当成一个看待
for i 相当于for i in “$@”
$RANDOM    //随机数
$?  // 返回值

 

2.echo

echo $?   // 对上一次命令执行成功与否成功$?为0

3.if等一些需要条件判断的语句
(1)判断文件是否存在且是否为文件
[ -f file ]
判断文件是否存在且是否为可写文件
[ -w file ]
判断文件是否存在且是否为可执行文件
[ -x file ]
判断文件是否存在且是否为可读文件
[ -r file ]
判断文件是否存在且是否为目录文件
[ -d file ]
判断文件是否存在且是否为空文件
[ -s file ]
判断文件是否存在
[ -e file ]
[]和 test功能一样  -a和-o(和,或)

(2)整数值比较判断
[ -eq ]
[ "$a" = "0" ]
(( a % 2 == 0 ))

注意:(( a == 50 )) 数值的比较,在(())里用不用$都一样


[ -n string ]     //string 的长度大于0
[ -z string ]     //string 的长度为0
 string1=string2    //字符串相等
 string1!=string2    //字符串不相等
[ int1 -gt int2 ]   //int1>int2      greater than
[ int1 -ge int2 ]   //int1>=int2     greater equal
[ int1 -eq int2 ]   //int1=int2        equal
[ int1 -ne int2 ]   //int1!=int2      not equal
[ int1 -le int2 ]   //int1<=int2         less equal
[ int1 -lt int2 ]   //int1<int2       less than

(3)符串比较
[ "$a" = "$b" ]
[ -n "$a" ]和 [ "$a" ]一样 判断字符串$a是否为空
[[ "$a" == *"redhat"* ]]和[[ "$a" = *"redhat"* ]]判断-在$a中是否含有redhat字符串

(4)if后接的是命令 &&和||
if rpm -q gcc && id tom||echo "sss"  // &&如果前面的命令执行成功则执行&&后的命令否则执行||后面的命令

4.sed

sed -ri /^#ServerName.*:80$/s/^#// /etc/selinux/config  //找出/etc/seliunx/config文件中以#ServerName开头以:80结尾的行并将#替换成空白

5.

df -Th|grep "/$"|awk '{print $6}'|sed 's/%//'  //df后截取某个字段并替换

6.数学运算
将运算的结果赋值给一个变量
declare -i c=10+20
c=$[ a+b ]
c=$(( a+b ))
(( c=a+b ))
let c=a+b
能输出结果
 expr 1 + 1

 

7.echo
交互模式可以用管道或重定向传值
echo "scale=2;10/3"|bc    // 计算10/3的值
echo "3.14 > 3.15" | bc    //正确输出1
echo "123"|read a
echo -e    //后面的字符启用转义
echo -n    //输出不换行


8.read

注意:每一行的输入以空格结尾
read -s a          //读入时不显示输入
read -p " 提示语言" a    //设置有提示语言
read -t 3 a       //设置3秒不给a赋值脚本继续执行
read   a b <file1     //没有循环 将第一个字段赋值给a,第二个字段赋值给b

例子:
cat file1
a1 tom a1
a2 jerry aa
a3 mike a34
read a b c <file1
此时 a=a1 b=tom c=a1

9.注意:grep awk sed 是基于正则表达式设计的


用双引号将正则表达式引起来:
^    行首定位符 ^love 匹配所有以love开头的行


$     \行尾定位符love$匹配所有以love结尾的行


.     单个任意字符l..e匹配以l开始后跟两个字符再跟一个e的字符串


*    重复0到多个星号前面的字符a* 匹配0个或多个a的字符串


[]       匹配一组字符的任意一个[Ll]ove 匹配Love或love的字符串


[x-y]         匹配制定范围的一个字符[A-Z]ove匹配大写字符开头后跟ove的字符串


[^]        匹配不在指定组内的字符;[^A-Z]配不是大写字母的任意字符


\               转义字符用来转义元字符love\.匹配love后跟一个.的字符


!        取反


+   表示一个或多个 xyz+ 一个或多个z


?   表式0个或一个xyz? 0个或一个z


RE元字符
\< 词首定位符\<love   //匹配love开头的词
|> 词尾定位符love\>   //匹配love结尾的词
\<bin\>         //匹配一个单词
\(..\)          //给匹配的字符打上标签(lov)able\1er/ 模式lov被保存为标签1用\1表示
查找一个字符串lov后跟上able,再跟上lov再接上er即:lovablelover
x{m}和x{m,}和x{m,n}字符x重复出现:m次,至少m次,至少m次,并不超过n次
o{5,10} 匹配包含5~10个o的字符串

(1)sed

sed    //循环 一行一行的处理文件     行处理
sed -n '/abc/p' file  // 默认会打印模式空间的内容,行中匹配abc的打印出来 

            -r  支持扩展分割符
           -n  不让他默认打印模式空间


 sed root@10.0.2.253 sed 's/abc/def' file    //远程登录后修改file里的内容
sed -n '5p' file  // 把第五行打印出来


sed -n '$p' file  //  把最后一行打印出来


sed -n '1,3p' file   // 把一到三行打印出来


sed -n '1,~3p' file  //  从第一行开始打印三行


sed  -i '3i aaaaaaa' file   // 在第三行的前面加上aaaaaaa


sed -i '$a  aaaaa' file   // 在最后行加入aaaaa


sed  -i '/^tom/i  aaaaaa' file   // 在以tom开头的行前一行加上aaaaaa


sed  -i  's/abc/def/' file  // 改每一行的第一个abc成def


sed  -i  's/abc/def/g' file  // 改每一行的所有abc成def


sed  -i  's/abc/def/3' file  // 改每一行的第三个abc成def


sed  -i  '1,2s/abc/def/' file   // 改一到两行abc成def
s 换匹配的字段 c换匹配的行
sed  -i  '1,2s/^.*$/def/' file  // 改一到两行成def


sed  -i   '4c aaaaaaaaa' file   // 把第四行改为aaaaaaaa


sed -i  '/^SELINUX/c  selinux '  // 把所有以SELINUX开头的行改为selinux


sed -i  '4d'      // 把第四行删除


sed -i  '/^tom/d' file  // 删除以tom开头的所有行


sed -i  '/^$/d' file   // 删除空行


sed -i  '/^\s$/d' file   // 删除开头为空行\s表示空格或tab


sed  -i '/^abc/s/tom/jerry/'  file  //  先找到以abc开头的行将这一行的tom改为jerry


sed -i '/^mike/s/^/#' file  // 将mike行注释


sed  -n  '1p; 3p'  file  //  打印第一行和第三行


sed -i -e '1s/jerry/tom/;   -e 3s/mike/xyz/'  file   // 多条一起执行用-e


sed -i '/abc/,/^def/s/123/456/' file  //  将abc开头的行和def开头的行之间的行的123改>为456


sed  -n '1,/def/p' file         // 从第一行开始直到碰到def的行全部打印出来

(2)awk

awk  // 按行处理行里字段  循环命令,默认以空格作为分割符 默认打印整行$0 -F分割符   制定分割符


awk  'BEGIN{print  "aaaa"}/tom/{print $2}END{print "bbbbbbb"}'  file1  //先执行BEGIN里的语句 从文件中读取第一行是否匹配/tom如果有则执行没有就不执行直到读,完后再运行END的语句  可以选用BEGIN  匹配项 ENG。


awk 'NR==2{print $2}'  file    //  NR是行号 NF字段数


awk 'NR==2||NR==4{print $2}' file    // 只读两个固定的行号


awk  '{print $0}' file   // $0表示 整个行


awk 'BENGIN{FS=":" OFS="  "}/bash$/{print $0}' file    //FS 指定了分割符:OFS 指定了输出的字段分割符,tr ":" "" 将冒号改为空格

awk  -F: -v v1=$a '$1~^v1'  file     //打印出以变量a开头的行


awk  -F: '{if($1~/^root/)print $1}' file   //  打印出第一个字段以root开头的行的第一个字段

10.for循环

for 遇空格或回车算一次
for i in {1..10}   //{1..10}相当于1 2 3 4 5 6 7 8 9 10
seq 2 2 10      //从2到10 每隔一个取一个数

11.while循环

语法结构:while ((i<=10));do

例子:

while [$a ];do   //相当于while [ -n $a ] do while [ 1 ] do 死>循环
cat file|while read a b c;do     //每次读一行文件将参数(以空格分割)分别赋值

 

---恢复内容结束---

  首先学习赵文宇的总结脚本:

1.变量

HOST=$(/bin/hostname)  //将()里的命令执行后的结果赋值给HOST变量
HOST=`/bin/hostname`  //将反引号里面的执行结果赋值给HOST变量


${a}aaa变量a
export a    //将本地变量a变成环境变量在子bash也可用
$PATH    //路径变量 PATH=$PATH:/$HOME/bin 增加路径
$$    //显示当前的进程号
$PPID  // 父进程号
$USER  // 当前用户
$UID    //当前用户的UID
$HOSTNAME   //当前的主机名
$1 $2 $3  $4....  // 要传递的参数
shift   //将参数向前移动一位
$0   //当前的脚本的名称
$#   //要传递参数的个数
${!a}   //间接取变量a值
$@和$*    //所有的位置参数 区别$@最好用双引号$*最好不要用双引号
“$@”     //能包括空行 “$*” 所有的参数当成一个看待
for i 相当于for i in “$@”
$RANDOM    //随机数
$?  // 返回值

 

2.echo

echo $?   // 对上一次命令执行成功与否成功$?为0

3.if等一些需要条件判断的语句
(1)判断文件是否存在且是否为文件
[ -f file ]
判断文件是否存在且是否为可写文件
[ -w file ]
判断文件是否存在且是否为可执行文件
[ -x file ]
判断文件是否存在且是否为可读文件
[ -r file ]
判断文件是否存在且是否为目录文件
[ -d file ]
判断文件是否存在且是否为空文件
[ -s file ]
判断文件是否存在
[ -e file ]
[]和 test功能一样  -a和-o(和,或)

(2)整数值比较判断
[ -eq ]
[ "$a" = "0" ]
(( a % 2 == 0 ))

注意:(( a == 50 )) 数值的比较,在(())里用不用$都一样


[ -n string ]     //string 的长度大于0
[ -z string ]     //string 的长度为0
 string1=string2    //字符串相等
 string1!=string2    //字符串不相等
[ int1 -gt int2 ]   //int1>int2      greater than
[ int1 -ge int2 ]   //int1>=int2     greater equal
[ int1 -eq int2 ]   //int1=int2        equal
[ int1 -ne int2 ]   //int1!=int2      not equal
[ int1 -le int2 ]   //int1<=int2         less equal
[ int1 -lt int2 ]   //int1<int2       less than

(3)符串比较
[ "$a" = "$b" ]
[ -n "$a" ]和 [ "$a" ]一样 判断字符串$a是否为空
[[ "$a" == *"redhat"* ]]和[[ "$a" = *"redhat"* ]]判断-在$a中是否含有redhat字符串

(4)if后接的是命令 &&和||
if rpm -q gcc && id tom||echo "sss"  // &&如果前面的命令执行成功则执行&&后的命令否则执行||后面的命令

4.sed

sed -ri /^#ServerName.*:80$/s/^#// /etc/selinux/config  //找出/etc/seliunx/config文件中以#ServerName开头以:80结尾的行并将#替换成空白

5.

df -Th|grep "/$"|awk '{print $6}'|sed 's/%//'  //df后截取某个字段并替换

6.数学运算
将运算的结果赋值给一个变量
declare -i c=10+20
c=$[ a+b ]
c=$(( a+b ))
(( c=a+b ))
let c=a+b
能输出结果
 expr 1 + 1

 

7.echo
交互模式可以用管道或重定向传值
echo "scale=2;10/3"|bc    // 计算10/3的值
echo "3.14 > 3.15" | bc    //正确输出1
echo "123"|read a
echo -e    //后面的字符启用转义
echo -n    //输出不换行


8.read

注意:每一行的输入以空格结尾
read -s a          //读入时不显示输入
read -p " 提示语言" a    //设置有提示语言
read -t 3 a       //设置3秒不给a赋值脚本继续执行
read   a b <file1     //没有循环 将第一个字段赋值给a,第二个字段赋值给b

例子:
cat file1
a1 tom a1
a2 jerry aa
a3 mike a34
read a b c <file1
此时 a=a1 b=tom c=a1

9.注意:grep awk sed 是基于正则表达式设计的


用双引号将正则表达式引起来:
^    行首定位符 ^love 匹配所有以love开头的行


$     \行尾定位符love$匹配所有以love结尾的行


.     单个任意字符l..e匹配以l开始后跟两个字符再跟一个e的字符串


*    重复0到多个星号前面的字符a* 匹配0个或多个a的字符串


[]       匹配一组字符的任意一个[Ll]ove 匹配Love或love的字符串


[x-y]         匹配制定范围的一个字符[A-Z]ove匹配大写字符开头后跟ove的字符串


[^]        匹配不在指定组内的字符;[^A-Z]配不是大写字母的任意字符


\               转义字符用来转义元字符love\.匹配love后跟一个.的字符


!        取反


+   表示一个或多个 xyz+ 一个或多个z


?   表式0个或一个xyz? 0个或一个z


RE元字符
\< 词首定位符\<love   //匹配love开头的词
|> 词尾定位符love\>   //匹配love结尾的词
\<bin\>         //匹配一个单词
\(..\)          //给匹配的字符打上标签(lov)able\1er/ 模式lov被保存为标签1用\1表示
查找一个字符串lov后跟上able,再跟上lov再接上er即:lovablelover
x{m}和x{m,}和x{m,n}字符x重复出现:m次,至少m次,至少m次,并不超过n次
o{5,10} 匹配包含5~10个o的字符串

(1)sed

sed    //循环 一行一行的处理文件     行处理
sed -n '/abc/p' file  // 默认会打印模式空间的内容,行中匹配abc的打印出来 

            -r  支持扩展分割符
           -n  不让他默认打印模式空间


 sed root@10.0.2.253 sed 's/abc/def' file    //远程登录后修改file里的内容
sed -n '5p' file  // 把第五行打印出来


sed -n '$p' file  //  把最后一行打印出来


sed -n '1,3p' file   // 把一到三行打印出来


sed -n '1,~3p' file  //  从第一行开始打印三行


sed  -i '3i aaaaaaa' file   // 在第三行的前面加上aaaaaaa


sed -i '$a  aaaaa' file   // 在最后行加入aaaaa


sed  -i '/^tom/i  aaaaaa' file   // 在以tom开头的行前一行加上aaaaaa


sed  -i  's/abc/def/' file  // 改每一行的第一个abc成def


sed  -i  's/abc/def/g' file  // 改每一行的所有abc成def


sed  -i  's/abc/def/3' file  // 改每一行的第三个abc成def


sed  -i  '1,2s/abc/def/' file   // 改一到两行abc成def
s 换匹配的字段 c换匹配的行
sed  -i  '1,2s/^.*$/def/' file  // 改一到两行成def


sed  -i   '4c aaaaaaaaa' file   // 把第四行改为aaaaaaaa


sed -i  '/^SELINUX/c  selinux '  // 把所有以SELINUX开头的行改为selinux


sed -i  '4d'      // 把第四行删除


sed -i  '/^tom/d' file  // 删除以tom开头的所有行


sed -i  '/^$/d' file   // 删除空行


sed -i  '/^\s$/d' file   // 删除开头为空行\s表示空格或tab


sed  -i '/^abc/s/tom/jerry/'  file  //  先找到以abc开头的行将这一行的tom改为jerry


sed -i '/^mike/s/^/#' file  // 将mike行注释


sed  -n  '1p; 3p'  file  //  打印第一行和第三行


sed -i -e '1s/jerry/tom/;   -e 3s/mike/xyz/'  file   // 多条一起执行用-e


sed -i '/abc/,/^def/s/123/456/' file  //  将abc开头的行和def开头的行之间的行的123改>为456


sed  -n '1,/def/p' file         // 从第一行开始直到碰到def的行全部打印出来

(2)awk

awk  // 按行处理行里字段  循环命令,默认以空格作为分割符 默认打印整行$0 -F分割符   制定分割符


awk  'BEGIN{print  "aaaa"}/tom/{print $2}END{print "bbbbbbb"}'  file1  //先执行BEGIN里的语句 从文件中读取第一行是否匹配/tom如果有则执行没有就不执行直到读,完后再运行END的语句  可以选用BEGIN  匹配项 ENG。


awk 'NR==2{print $2}'  file    //  NR是行号 NF字段数


awk 'NR==2||NR==4{print $2}' file    // 只读两个固定的行号


awk  '{print $0}' file   // $0表示 整个行


awk 'BENGIN{FS=":" OFS="  "}/bash$/{print $0}' file    //FS 指定了分割符:OFS 指定了输出的字段分割符,tr ":" "" 将冒号改为空格

awk  -F: -v v1=$a '$1~^v1'  file     //打印出以变量a开头的行


awk  -F: '{if($1~/^root/)print $1}' file   //  打印出第一个字段以root开头的行的第一个字段

10.for循环

for 遇空格或回车算一次
for i in {1..10}   //{1..10}相当于1 2 3 4 5 6 7 8 9 10
seq 2 2 10      //从2到10 每隔一个取一个数

11.while循环

语法结构:while ((i<=10));do

例子:

while [$a ];do   //相当于while [ -n $a ] do while [ 1 ] do 死>循环
cat file|while read a b c;do     //每次读一行文件将参数(以空格分割)分别赋值

 

posted @ 2015-02-01 13:52  大都比2号  阅读(219)  评论(0编辑  收藏  举报