变量的分类
 本地变量: 只对本地有效,对子shell无效    // /bin/bash 打开子shell
 环境变量: 对本地和子shell都有效
   export A=3
   或
   A
   export A
         export  //查看当前系统环境变量

## exprot部分显示结果    declare -x DISPLAYE=“”         //指定输出显示器
   declare -x HISTSIZE="1000"     //history能保存的命令条数
   declare -x HOME="/root"         //当前用户家目录
   declare -x HOSTNAME="server45.example.com"   //当前主机名称    
   declare -x LANG="zh_CN.gbk"             //所使用的语言
   declare -x LOGNAME="root"          //登录用户的名称
   declare -x OLDPWD="/tmp"          //上一个路径
   declare -x PATH="/usr/kerberos/sbin:/usr/kerberos/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin"
   declare -x PWD="/tmp/scripts"     //当前路径

   printenv  //类似export
   env       //显示当前环境变量
   
 特殊变量:$?                                  
   ehco $?     //上一个命令是否执行成功  0代表成功 1-255失败

[root@server45 ~]# llsss
-bash: llsss: command not found
[root@server45 ~]# echo $?
127

  位置参数变量: 需要用户通过命令引用,很有用的变量
  $1,$2,$3   超过10时建议加{}  ${11} 
   算数运算:
  $[]    //echo “$[$A+$B]”
  $(( ))  //echo "(($A+$B))"

#!/bin/bash
#
echo "$1+$2 is $[$1+$2]"
echo "$1-$2 is $[$1-$2]"
echo "$1*$2 is $[$1*$2]"
echo "$1/$2 is $[$1/$2]"

写一个脚本,完成以下功能:
1、传递两个整数给脚本,让脚本分别计算并显示这两个整数的和、差、积、商。

 \         //避免展开变量 echo "Your Salary : \$1"           //该命令并不会显示$1的值,而是显示$1
[root@server45 ~]#  echo "Your Salary : \$1"   
Your Salary : $1

BASH的命令别名
  alias
 

例如将cls设置为lear方便使用
   alias cls=clear
   unlias cls
   alias cdnet='cd /etc/sysconfig/network' //有空格用''   
 
 全局变量:/etc/profile, /etc/profild.d/*, /etc/bashrc  对所有用户都作用

       /etc/bashrc     //可设置alias对所有用户有效
       /etc/profild.d/*   //将profile分成片便于管理
       /etc/profild        //设置全局有效变量,永久有效
         export DFSF=dfsf  //需注销才生效
         source /etc/profile //重读profile,可立刻生效,不建议
 局部变量: ~/.bash_profile, ~/.bashrc ~/.bash_logout  只对当前用户有效
 profile类:
  1.设置环境变量
  2.运行用户登录时要执行的一些命令
 bashrc类    
  1.设置别名
  2.设定本地变量
------------------------------------------------------------------------------------------------- 
 shell分类:
  1.交互式登录式shell
   用户登录进去输入命令
   过程: 
    /etc/profile --> /etc/profile.d/* --> ~/.bash_profile --> /etc/bashrc
  2.非登录式shell
   脚本执行过程中,系统自动运行,不需要用户登录输入命令
   过程:
    ~/.bashrc --> /etc/bashrc --> /etc/profile.d/×

——————————————————————————————————————————————————

输入/输出重定向 ,管道   输出流
 I/O重定向分为:

  标准输入 :/dev/stdin,  0, KEYBOARD,<    //平常可以不输入
  标准输出 :/dev/stdout, 1, MONITOR,  >       //命令正常执行      cat > /tmp/ls1.out
  错误输出 :/dev/stderr, 2, MONITOR, 2>      //命令错误执行      cat 2> /tmp/ls2.out
                                                                                //lessss &> /tmp/ls3.out      //&> 合并>和2> 

例如

ls /var >> /tmp/var.out 2>> /tmp/var.err              //正确的信息存在var.out,错误的在var.err

其他的重定向
   >     //覆盖输出重定向  
    >>    //追加输出重定向            
   set -C       //开启避面覆盖重定向
   set +C       //关闭
   >|           //强制覆盖

自定义输出重定向
exec 3> /tmp/myout.out //实现多次重定向到一个文件,避免多次打开关闭一个文件,提升脚本执行效率
>> //追加
< //读入
ls /var >&3
exec 3>&- //关闭文件

写一个脚本:
1、设定变量FILE的值为/etc/passwd
2、使用循环读取文件/etc/passwd的第2,4,6,10,13,15行,并显示其内容;(提示:LINE=`head -2 /etc/passwd | tail -1`可以取得第2行)
3、把这些行保存至/tmp/mypasswd文件中

#!/bin/bash
#
FILE=/etc/passwd
exec 3>> /tmp/mypasswd                    //打开

for N in 2 4 6 10 13 15 ; do
  LINE=`head -$N $FILE | tail -1`
  echo $LINE
  echo $LINE >&1
done

exec 3>&-                                 //关闭   
unset FILE LINE

————————————————————————————————————————————————————————————————————————

管道 | : 把第一个命令的输出送到第二个命令处理
  echo "123456" | passwd --stdin rehat       //这个命令将123456交给passwd来处理,--stdin参数会使123456立刻生效成为用户redhat的密码
  ls /etc | tee /tmp/ls.out | less   //tee可以把输出流保存到指定文件 并交给下一个命令处理
  多个命令的输出都需要保存至同一个文件
  command >> a.out
  command >> a.out  

    /dev/null    null 指空文件,任何被放到Null的数据都被删除,在linux里是一个常用的命令,可以轻松去除输出结果,不过要小心使用

    比如: ls /var/ttt &> /dev/null    //无论结果如何,都输出到null里,不会显示结果
——————————————————————————————————————————————————

 程序执行流 

分类:
 顺序执行
 选择分支 
 循环执行                                  //这一次只学习for循环
  for I in LIST ; do                       //LIST是这个循环的条件,也叫做列表,可以是字符,数字,表达式
   statement1
   statement2
  done

列表分类:
  简单列表: 1 2 3 4

  复杂列表: This is TOM`s cat
  命令    : `ls /var`
  通配符  : for I in /var/*

  
  例如:
  for LINE in `cat /etc/passwd`: dao
  而外说明
  IFS=$'\n'      //for 循环只是别换行符
   
   写一个脚本:添加10个用户user1-10

#!/bin/bash
#   
for I in 1 2 3 4 5 6 7 8 9 10 ;do    //或者for I in `seq 1 10`
    usradd user$I
    echo user$I |  passwd --stdin user$I
   done


## seq 1 10    //代表 1~10 
## 也可以使用{1..10}

文本处理类命令cut  -d: -d""    

 //指定分隔符:或"" -f     //指定第几段 

[root@server45 scripts]# tail -1 /etc/passwd | cut -d: -f6    

 /home/dean 

grep与正则表达式 
 
grep:  全面搜索正则表达式并打印出来
 grep,egrep,fgrep

  grep [options] "PATTERN“ file...                     //grep的用法
  -i   //不区分大小写
  -v   //显示没有匹配到模式的行
   -n   //显示匹配的行在原文中所处的行号
   -An  //显示后n行   
   -Bn  //显示前n行
   -Cn  //上下文,显示上线n行
   --color   //把匹配的高亮显示
 模式
 
 正则表达式,元字符 re 
 ^        //锚定行首   ^love  love必须在行首
 $        //锚定行尾
 .        //用于匹配任意单个字符
 *        //root*   *前的t可以出现0次或任意次
  ?
  []       //匹配一组字符中任意一个
  \
  \<       //词首定位符
  \>       //词尾定位符
  x\(m)\   //x精确出现m次
  x\(m,)\  //x至少出现m次
  x\(m,n)  //x至少出现m次,最多m次
  \(...)\  //任意长度的任意字符
 
  grep -E = egrep
  +  相当于\{1,\}
  ?  相当于\{0,1}\
  |  或 
    ’love|hate‘ e或h谁出现都行

grep练习

1、显示/proc/meminfo文件中以不区分大小的s开头的行;
   grep -i s /proc/meninfo               //使用-i 不区分大小写
2、显示/etc/passwd中以nologin结尾的行;
   grep nologin$ /etc/passwd             //$符号锚定结尾
3、显示/etc/inittab中以#开头,且后面跟一个或多个空白字符,而后又跟了任意字符的行;
   grep --color ^#[[:sapce:]]\{1,}\ /etc/inittab         //^符号锚定开头,[[:space:]].*用来匹配多个连续空白字符
4、显示/etc/inittab中包含了:一个数字:(即两个冒号中间一个数字)的行;
    grep :[0-9]: /etc/inittab	                   
5、显示/boot/grub/grub.conf文件中以一个或多个空白字符开头的行;
    grep ^[[:space:]]\{1,\}.*" /boot/grub/grub.conf            
    grep  -E --color "^[[:space:]]{1,}.*" /boot/grub/grub.conf     //egrep解法,注意与grep区别{} 
6、显示/etc/inittab文件中以一个数字开头并以一个与开头数字相同的数字结尾的行;
   grep "^\([0-9]\).*\1" /etc/inittab             //使用\(\)  \1   来做前后匹配   注意使用“” .*用以匹配任意个连续字符               
7、ifconfig命令可以显示当前主机的IP地址相关的信息等,如果使用grep等文本处理命令取出本机的各IP地址,要求不包括127.0.0.1;
   ifcofig | grep "inet addr" | grep -v '127.0.0.1' | cut -d: -f2 | cut -d "" f1         //grep与cut的混合使用
8、显示/etc/sysconfig/network-scripts/ifcfg-eth0文件中的包含了类似IP地址点分十进制数字格式的行; 
   grep -E "([0-9]{1,3}\.){3}\.[0-9]{1,3}" /etc/sysconfig/network-scripts/ifcfg-eth0     
   grep "[0-9]\{1,3\}\."\{3\}\.[0-9]\{1,3\} /etc/sysconfig/network-scripts/ifcfg-eth0    //注意egrep和grep的区别

————————————————————————————————————————————————————————————————————————
短路操作符 
&&            //与运算,当你需要判断使用两条命令是,使用&&: 如果第一个运行结果错误,那么继续运行第二个命令,结果为第二个命令,

                                                                                             如果第一个命令正确,那么将不会在运行第二个命令
 1 && ? = ?
 0 && ? = 0
||               //或运算,使用|| : 如果第一个命令结果错误,那么结果直接为第一个命令,

                                              如果第一个命令结果正确,那么结果为第二个命令
 1 || ? = 1
 0 || ? = ?
 

## 结合/dev/null的使用,将会发挥很重要的效果

例如   cat /tmp/aaa >> /tmp bbb || cat /tmp/aaa &>/dev/null      

##这个命令,如果aaa不存在的话,将会直接将结果输出到/dev/null下,而不会占用系统资源输出错误信息

 

写一个脚本:
1、添加10个用户user1到user10,但要求只有用户不存在的情况下才能添加;

#!/bin/bash
#

for I in {1..10} ; do
  grep user$I /etc/passwd &> /dev/null || useradd user$I         //如果用户存在,直接输出到/dev/null,负责增加用户user$I
done

unset I


 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

编程语言:
脚本语言:bash,perl(语言学家),python(灵活,简洁),ruby,php
以源程序的方式存在,执行前不需要编译,而是靠一个解释器执行
维护简便
执行效率差

编译型语言:
编辑-->编译-->链接-->运行


脚本:命令的堆砌
#!/bin/bash //第一行标准 shebang
#

nano myscript.sh
chmod +x myscript.sh
./myscript.sh //执行脚本

 

Logo

更多推荐