Shell杂笔

               linux  相当于操作系统的外壳,通常是Bash
shell
               Windows   -C:\Windows\System32\cmd.exe

     手动选择Shell环境(常用的有bash、zsh、tcsh),相当于新建一个子环境
#tsch   直接进入该shell环境
#pstree    |  gree login  可以查看登陆后shell环境的变化

sh  -x   脚本    -------开启调试模式
脚本中可以插入echo断电,echo ‘提示信息’
可执行语句    &>  /dev/null     忽略无关输出

顺序分隔
1. 命令1 ;命令2              2.   命令1 && 命令2               3. 命令1  ||  命令2             4.命令1   |    命令2

                                                                 

                                                                变量
定义变量   ---------->    变量名=变量值
注意:1.若指定变量已存在,相当于为此变量重新赋值
2. 等号两边不要有空格
3.变量名由字母/数字/下划线组成,区分大小写
4.变量名不能以数字开头,不要使用关键字和特殊字符

echo    $变量名       /       echo   ${变量名}   ------------>  查看变量
unset     变量名      ---------->   取消变量

变量类型
环境变量                      变量名通常大写
位置变量                      存储在执行脚本时提供的命令行参数
预定义变量                   可直接调用,不能直接修改
自定义变量

环境变量      /etc/profile         ~/.bash_profile
env:列出所有环境变量
set:列出所有变量

预定义变量         用来保存脚本程序的执行信息
$0        当前所在的进程或脚本名
$$        当前运行进程的PID
$?        命令执行后的返回状态值,0表示正常,1或其他值为异常
$#        已加载的位置变量的个数
$*         所有位置变量的值

全局变量定义:         export      变量名=变量值                     -n     变量名  (取消变量)

read取值的用法
read   变量名       或者          read   -p       “提示信息”     变量名

变量赋值时,若值内有空格需要引号
几个变量被定义为其他变量时要引号

符号(“”、''、)
"  " :1.双引号内允许$扩展,可调用其他变量的值           2.出现特殊字符时候,可以采用\ 符号转义
3. 变量值不包括空格、制表符时,双引号通常省略

‘  ’:所有字符均视为该字符本身,且不允许\ 转义

转义字符: \n  换行符           \t 制表位       \\        \''       \# .....
A= “a\tb\tc\nd\te”            echo  -e  $A      --------->     a    b    c
                                                                                  d    e                         -e   解析特殊转义符

截取字符串
expr      substr     变量    起始位置    截取长度   /     命令输出 |  cut  -c  起始位置  结束位置   /     命令输出 |  cut  -d  ‘分隔符’
-f   字段编号
$[var1:起始:截长]      $[var1::截长] 

替换字符串
${var1/old/new} ------- 单个替换
${var//old/new} ------- 全局替换
tr  单字替换          命令输出  |  tr   ‘abc’  ‘ABC’     /       命令输出  |  tr  -d   ‘abc’  删除

                                                         基本运算
四则 (+、-、*、/)、 取余数、求模(num1 % num2)、

expr           计算工具      
expr       数1     运算符     数2     ;    乘法时采用 \* 转义,避免被shell当作通配符

算式替换         $[ ]
$[数1  运算符   数2 ]            ;乘法无需转义,引用变量可省略$,需echo才能显示到屏幕上

自增表达式
先运算,将运算结果保存到这个变量
后取值,以这个变量的新值作为整个表达式的值
加法              i +  =2 -----i = i + 2
减法              i - =2 ------i = i - 2
乘法              i * =2 ------i = i *2
除法              i / = 2 -----i = i/2
求模              i % =2 ----i = i %2

i + =1 
当变量自增/减数量为1时,数量1可以省略,+= 可写成++,-=写成 --,即++i 相当于 i + =1

++i 与 i++ 区别
++i / --i   先运算,将结果保存到该变量,后取值,调用该变量
x=48 ; echo  $ [++x],$x ---------> 49,49
i++ / i--   先取值,调用该变量旧值,后运算,将结果保存到这个变量
x=48 ; echo  $ [x++],$x ---------> 48,49

RANDOM    ---- 环境变量     /bin/bash下直接调用,值在0~32767的整数随机
$[ ]结合*,将随机数范围扩大     echo   $[RANDOM*RANDOM ]
$[ ]结合%,除以指定阀值取余
求模减小后的随机数,加一定值,限制随机数

let    -------   操作变量值运算 ,echo才输出
seq       -------  指定输出一组整数(默认从整数1开始,缺省相邻两数差值增量步长也是1)
               末数   /   首数 末数  /    首数   步长  末数 
seq  末数   ----- 默认换行(\n)为分隔符,-s 定义分隔符
seq   首数  末数    --------   默认按整数值的实际位数显示,-w 显示等宽(不足前置0)

小数运算
可以使用bc(计算模式),设置scale=n 可以约束小数位
可以使用管道直接显示结果,避免交互    echo    “scale=4;$A*56.789;5/3” | bc -------------> A=12.34

小数比较
echo  “数1   比较符    数2 ”  |  bc      比较符  >,<,>=,<=,==,!=       表达式成立为1,否则为0

dirname     --------获取目录位置

随机数的设备/工具                                                      随机信息转化
常见数变量           RANDOM                                       md5sum   校验工具
特殊设备文件      /dev/urandom
UUID生成命令         uuidgen    默认会有一连字符,可用tr命令删除,cut截取所用长度

命令替换
反撇号     `命令`   例如: rpm   -qf    `which  tr`
$( )           $(命令)     方便命令嵌套使用         rpm   -qi  $( rpm   -qf $( which  tr))  

返回状态值         $?
判断前条命令是否成功,查看$?值,为0则是成功否则为异常
uname    -r   |grep   -q   ^3.0  ; echo  $?

换行标记区别
Windows       \r、\n
Linux           \n

文本格式转换
unixdos       Linux文件
dos2unix      Windows文件

多参数分散处理
find      ....   -exec  ..... {}  \;   适用处理文件或目录参数
xargs    1. 根据给定的参数以行为单元分次执行目标命令行
             提供参数命令      |    xargs   目标命令
              xargs     --arg-file=参数文件     命令
 2.文件改名、复制等参数      (-d  指定分隔符  / -I  定义标记)
例如:ls     A.log*  ------> A.log 、A.log.syslog
ls  A.log*  |  xargs  -I  {}  cp  {}  {}.new     复制文件并且添加后缀
ls     A.log*  ------> A.log 、A.log.syslog、A.log.new 、A.log.syslog.new

测试工具            test
test         选项                 参数
         [选项        参数]
-e     检测对象是否存在                  -r/w/x       检测是否有读写执行的权力
-d      检测是否为目录                    -f   检测是否为文件
test     -f          /etc/hosts  ; echo  $?   = [-f    /etc/hosts  ]  ; echo      $?

比较整数
test         整数1         选项       数2              -eq 等于      -ne 不等于     -ge  大于等于                    
      [数1       选项          数2 ]                      -le  小于等于     -gt   大于       -lt  小于

组合多个条件
test       测试条件1    -a/-o        测试条件2                           [[  测试1     &&/ ||          测试2  ]]

比较字符串
[字符串1   选线   字符串2]        = 两者相同         -z  字符串值为空
[选项    字符串]                         != 两者不同      -n   字符串值不为空

循环语句
                                     if  语句                                   
if    条件测试                                 if       条件测试                       if   条件测试1
     then   命令                               then   命令                                   then  命令
fi                                                    else  命令                               elif  条件测试2
                                                      fi                                               then   命令
                                                                                                       else   命令
                                                                                                    fi
                                    for 循环
for     变量名           in      值列表   
      do        命令
done
                                     while循环          (只要条件满足,会一直循环,需要条件控制)
while       条件测试
       do       命令
done
实例:批量添加用户
#!/bin/bash
i = 1
while  [ $i  -le  50 ]
   do    
         useradd   user$i
         echo  ''joker''  | passwd  --stdin  user$i  & >/dev/null
         let   i++    (递增控制,防止死循环)
done

中断控制语句循环
break            跳出当前所在的循环体,执行循环体之后的语句块
continue       跳过循环体中剩下语句,重新判断条件执行
exit                退出脚本,可指定返回值(默认为0)

$0   该程序的执行名字        $n   该程序第n个程序
$#   该程序参数个数            $?  返回上一指令的返回值

[ -f   ''$file" ]                            判断$file是否为文件
[  $a  -lt  3 ]                            判断$a是否<3,-gt  表示为 >
[ -x  "$file" ]                            判断$file是否有执行权, -r 为可读性
[ -n  "$a"   ]                             判断变量$a是否有值,-z 测试空串
[ "$a" = "$b" ]                         判断$a与$b取值是否相等
[ cond1  -a  cond2 ]                两个是否成立,-o 为两者有一个成立

                                       case语句
case       变量值     in
                条件
               命令;;
*)
               命令
esac


shell函数(shell环境中,一直重复使用的操作定义为公共的语句块,称为函数)
function         函数名{                           或者        函数名() {
              命令                                                             命令
}                                                                                }
type   函数名    --------->  查看指定函数构造


一些命令集合
chkconfig          设置适用级别、启动/停止顺序、服务说明
例子:#!/bin/bash
          #chkconfig:11    10     5 (运行级别、服务启动默认顺序,关闭顺序)

ls    -S   文档大小降序排列 / -t  文档修改时间降序排列  /  -r  反序排列

uniq        文件        ====== 去除重复内容(连续的才去重)
         -c   统计重复次数        

sort       排序工具

-b:忽略每行前面开始的空格字符,空格数量不固定时,该选项几乎是必须要使用的("-n"选项隐含该选项,测试发现都隐含)
-c:检查文件是否已经按照顺序排序,如未排序,会提示从哪一行开始乱序
-C:类似于"-c",只不过不输出任何诊断信息。可以通过退出状态码1判断出文件未排序
-d:只处理英文字母、数字及空格,忽略其他的字符
-f:将小写字母视为大写字母
-h:使用易读性数字(例如:2K、1G)
-i:除了040至176之间的ASCII字符外(八进制0-177),忽略其他的字符(忽略无法打印的字符如退格/换页键/回车)
-k:以哪个区间 (field) 来进行排序
-m:将几个排序好的文件进行合并,只是单纯合并,不做排序
-M:将前面3个字母依照月份的缩写进行排序
-n:依照数值的大小排序
-o<输出文件>:将排序后的结果存入指定的文件
-r:降序
-u:忽略相同行
-t<分隔字符>:指定分隔符,默认的分隔符为空白字符和非空白字符之间的空字符

tac    -----------反序输出文本行
rev   ------------反序输出字符串
tee  ------------整合重定向(既显示结果也保存结果)


                                                                正则表达式
^    匹配行首         ^ac    匹配所有以ac开头的行
$    匹配行尾         $d     匹配所有以d结尾的行
.     单个任意字符      /r..t       匹配r开头t结尾的所有字符
*    匹配0或多个前导字符(含回车)    a*ool   匹配0或多个a开头ool结尾的行
[]    匹配指定字符组内任意字符         /^[abc]/    匹配abc开头的行
+    最少匹配一次     a+   匹配一个或多个a
?   最多匹配一次     a?  匹配0或1个a
()  子表达式组合   (abc)+   匹配一个或多个连续的abc
[^]   匹配不在指定字符内的其他字符     /^ [^abc]  匹配不以abc开头的行

元字符{}
限定表达式匹配次数
{n}   匹配n次   (ab){2}----abab
{n~m}  匹配n~m次   (ab){1,2}----ab,abab
{n,}  至少匹配n次   (ab){2,}-----abab,以及之上

[]
[abc]   匹配a或b或c
[a-z]    匹配任意字母小写
[A-Z]   匹配任意字母大写
[0-9]   匹配任意数字
[^]     取反匹配

\b   单词边界       \broot\b  匹配root
\<   单词开头       \<th    匹配th开头的单词
\>   单词结尾       \<root\>   同 \broot\b效果

                                                                      awk内置变量
FS   保存或设置字段分割符         FS=":"
$n    n整数 ,指定分隔第n个字段
$0    读入整行内容,不写也可因为是默认
NF   记录当前处理行的字段个数(列数)
~      匹配       !~  不匹配
NR   记录当前已读入行的数量
FNR  保存当前处理行在原文本内的序号(行号)
FILENAME     当前处理的文件名
ENVIRON       调用shell环境变量    格式:ENVIRON ["变量名"]

统计使用bash的用户个数
awk    'HEGIN{x=0}/ \<bash$/ {x++} END{print x}'  /etc/passwd

awk中可使用
if结构
         if(条件){指令}              if(条件){指令}else{指令}          if(条件){指令}else if(条件){指令}else{指令}  
while循环
whle(条件){指令}      
    do{指令}  while (条件)
for循环
for(初值;条件;步长){编辑指令}

awk去重
     awk   '!a[$0]++'  filename
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值