shell一些总结

1.shell中变量的类型?
   
    shell中的变量类型有:本地变量、环境变量、位置变量、标准变量、特殊变量。

    1.1.本地变量在shell脚本的生存周期中使用的变量(也就是登录一个shell到退出,这个shell为生存周期)设置一个本地变量格式为:变量名=变量,显示一个变量:echo ${变量名}也可以不要大括号,显示本地所有变量:set就可以,本地变量还可以设置为只读的:readonly 变量名,这时的变量就具有只读属性,如果在shell下运行命令readonly,就会显示当前环境下所有的只读变量。
   
   1.2.环境变量用于所有的用户进程(也就shell下所有的子进程),这个就有点像windows中的环境变量了(系统–>高级–>环境变量),环境变量一般保存在$HOME/.bash_profile和/etc/profile中,前者是只适用于当前用户,后者适用于所有用户设置一个环境变量用export,比喻我们这里设置一个环境变量:export pagename=”ghostwwl”这样就设置了一个叫做pagename的环境变量,我们可以通过env这个命令来查看,还有就是可以直接通过运行export来查看。

   1.3.位置变量也就相当于程序中的参数(也就相当于C中的argv),在shell中位置变量一般允许$0-$9一共10个,超过10个的,嘿嘿就必须使用其他方式了。很显然这里$0就是脚本的名字了,从$1开始就是后面的参数了。说白了也就是那个argv了。
  
    1.4.标准变量,也就是bash环境建立的一些标准环境的标量,他会自动去解析,基本都在/etc/profile中定义了有EXINIT,HOME,IFS,LOGNAME,MAIL,MAILCHECK等。
    EXINIT 是vi编辑器初始化运行的一些参数
    HOME 这个傻子都知道,就是偶们的主目录
    IFS 一个个字段域之间用什么隔开的理论上可以任意字符,比喻/usr/bin;/usr/sbin
这里的IFS就是”;”了。
    LOGNAME 看名字就知道 是登录名可以用 echo $LOGNAME 来查看
    MAIL 表示当用户的邮箱路径
    MAILCHECK 表示每间隔多少秒检查一次收件箱
还有一堆标准变量PATH,tz,PS1,PS2,PWD等等,我这里就不全部写了,自己去找资料看,相信应该蛮好找的。

    1.5.特殊变量
$# 表示传递到脚本的参数列表
$* 以一个字符串显示所有向脚本传递的参数,跟位置变量不同的是这里参数可超过9个。
$$ 表示当前运行脚本的进程ID号
$! 表示后台运行的一个进程的ID号
$@ 与$#相同,但是使用时加引号,并在引号中返回每一个参数
$- 显示shell使用的当前选项,与set命令相同
$? 显示最后命令运行的推出状态,0表示没有错误,其他任何值表示有错误

2.shell中的变量替换

    这里说一下变量替换这个经常用到,其实就是用变量的值替 换他的名字,显示变量的时候就是这个,可以用:
为了试验我们先定义一个变量haha=”fuck you”
     a.${变量名}来搞定(这里的大括号可要可不要,不过偶一般都加)
     b.${变量名:+变量值}这个表示如果前面的变量值不为空,则显示变量值,否则置空,比喻echo ${name:+”ghostwwl”}这样可不管你以前有没有对name赋过值都会显示这里的”ghostwwl”
     c.${变量名:?错误信息}这个表示当变量名存在,就是变量的值,不存在就显示问号后面的错误信息比喻echo ${age:?+”No defined variable age”}这个因为age不存在所以它会显示错误信息age:No defined variable age
     d.${变量名:-变量值}这个表示如果如果变量名没有设置,就用这里给出变量值来代替,显然如果设置了肯定就是返回原来设置的值:比喻echo ${age:-24}因为age变量没有设置,所以它会用24去代替,如果是echo ${haha:-”hello”}这里会显示原来所赋的值”fuck you”记得不要跟b中的情况搞混。
     e.${变量名:=变量值}表示如果没有设置变量名这个变量,就设置它的值,比喻echo ${age:=24}因为没有设置age这个值,所以运行这句的时候会赋值并显示。当然这样赋值以后就可以把age当正常变量用了,也就是这时我们有haha和age这两个变量了。

    就这五种了(当然如果把第一种去掉大括号,就6种了),开始可能并不习惯,用多了就习惯了,啊哈哈!

3.清除变量(unset)
    能定义变量当然也就能删除变量了,比喻我们要删除那个haha,因为值为”fuck you”不太文明,我们可以用:unset haha 从这里就可以看出清除变量用unset 变量名。
    这里我们要注意,设置了readonly的只读变量不能取消也不能重新设置

例子:aa.sh
    #!/bin/bash
    #named aa
    echo “程序名为: $0″
    echo “姓名为: $1″
    echo “年龄为: $2″
    echo “所属省分为: $3″
    echo “所在城市为: $4″
    echo “参数个数为: $#”
    echo “脚本参数为: $*”
    echo “脚本进程ID为: $$”
我们再来运行这个脚本 ./aa.sh ghostwwl 24 hubei wuhan 结果为:
    程序名为: ./aa.sh
    姓名为: ghostwwl
    年龄为: 24
    所属省分为: hubei
    所在城市为: wuhan
    脚本参数个数为: 4
    脚本参数为: ghostwwl 24 hubei wuhan
    脚本进程ID为: 212

4.影响变量的一些命令
    4.1 declare 创建或显示变量
        参数-f 只显示函数名
        参数-r 创建只读变量(typeset也可以)
        参数-x 创建转出变量
        参数-i 创建整数变量
        如果参数中使用+来代替-,表示选项的含义相反。
    
    4.2 export 创建环境变量
        参数– 表明选项结束,所有后面的参数都是实参
        参数-f 表示在”变量-值”对照中的变量是一个函数名
        参数-n 表示把全局变量转换成局部变量(也就是本地变量)。
        参数-p 显示全局变量列表
 
    4.3 readonly 创建或显示只读变量
        参数– 表示选项结束
        参数-f 创建只读变量

    4.4 set 设置或者重设各种shell
    4.5 shift [n] 用来移动或调整位置变量,使$4赋给$3(也就是全都向前面移动一次),这个里面的n表示移动几位,默认是移动一位。
    4.6 typeset 这个就跟declare相同了
    4.7 unset 清除变量的定义
        参数– 表示选项结束
        参数-f 删除只读变量,但是不能sehll环境中制定的变量和函数。

5.shell的运算符
   5.1 位运算 ~,>>,<<,&,|,^ 一看就知道分别是取反,左移,右移,与,或,异或。
   5.2 $[]表示对[]中的表达式求值和$(())相等的。
   5.3 逻辑运算符 &&,||,>,<,==,!= 是人都看得懂跟C里一样的。

   5.4 赋值运算符 =,+=,-=,*=,/=,%=,&=,|=,<<=,>>=,^= 跟其他语言差不多一看就明白的。当然表达式赋值let $a=$b+$c这种形式。

   5.5 运算符的优先级我就不想废话了,都跟其他语言差不多的,自己去找

6.shell的一些技巧

  6.1 for循环消除空格影响for line in `cat /etc/passwd | sed 's/ /%20/g'`

  6.2 将循环数据结果进行排序输出

        例子:

     for line in `cat /etc/passwd | sed 's/ /%20/g'`
      do
         user=`echo $line | cut -d: -f1`
          echo $user
      done | \sort -k1,1 | \xargs -n 4

  6.3 经常用来分割字符串或文本,替换默认分隔符oldIFS=$IFS   IFS=":" 执行完后再替换回去

  6.4 验证输入信息是否合法

     parsed_input=`echo $input | sed 's/[^[:alnum:]//g'`
      if [ "$parsed_input" != "$input" ]; then
          echo "Your input must consist of only letters and numbers."
      else
          echo "Input is OK."
      fi

      nodigits=`echo $left_number | sed 's/[:digit:]//g'`
      if [ "$nodigits" != "" ]; then
          echo "Invalid number format!"
      else
          echo "You are valid number."
      fi

 7、printf

颜色特效控制:

printf("\033[1;33m Hello World. \033[0m \n");
颜色如下:
none         = "\033[0m"
black        = "\033[0;30m"
dark_gray    = "\033[1;30m"
blue         = "\033[0;34m"
light_blue   = "\033[1;34m"
green        = "\033[0;32m"
light_green -= "\033[1;32m"
cyan         = "\033[0;36m"
light_cyan   = "\033[1;36m"
red          = "\033[0;31m"
light_red    = "\033[1;31m"
purple       = "\033[0;35m"
light_purple = "\033[1;35m"
brown        = "\033[0;33m"
yellow       = "\033[1;33m"
light_gray   = "\033[0;37m"
white        = "\033[1;37m"

字背景颜色范围: 40--49                   字颜色: 30--39
            40: 黑                          30: 黑
        41:红                          31: 红
        42:绿                          32: 绿
        43:黄                          33: 黄
        44:蓝                          34: 蓝
        45:紫                          35: 紫
        46:深绿                        36: 深绿
        47:白色                        37: 白色

输出特效格式控制:

\033[0m  关闭所有属性 
\033[1m   设置高亮度 
\03[4m   下划线 
\033[5m   闪烁 
\033[7m   反显 
\033[8m   消隐 
\033[30m   --   \033[37m   设置前景色 
\033[40m   --   \033[47m   设置背景色

光标位置等的格式控制:

\033[nA  光标上移n行 
\03[nB   光标下移n行 
\033[nC   光标右移n行 
\033[nD   光标左移n行 
\033[y;xH设置光标位置 
\033[2J   清屏 
\033[K   清除从光标到行尾的内容 
\033[s   保存光标位置 
\033[u   恢复光标位置 
\033[?25l   隐藏光标 
\33[?25h   显示光标

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hhb200766

菩提本无树

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值