linux shell 精通教程笔记

######################Linux-shell############################

echo string
 用于字符串的输出
ls [-alrtAFR] [name...]
 显示指定工作目录下之内容(列出目前工作目录所含之文件及子目录)。
sudo
 以系统管理者的身份执行指令
vi/vim
 编辑器,进入后按o进行编辑
 编辑结束,先按esc键,退出插入模式,然后按住shift键,并连按两次z字符,即可保存刚才的编辑并退出vim编辑状态
 若是切换到命令行模式,按下esc,然后:开头
 1.保存不退出:
 :w 保存文件但不退出vi 编辑
 :w! 强制保存,不退出vi 编辑
 :w file 将修改另存到file中,不退出vi 编辑
 2.保存并退出:
 :wq 保存文件并退出vi 编辑
 :wq! 强制保存文件并退出vi 编辑
 3.不保存并退出:
 q: 不保存文件并退出vi 编辑
 :q! 不保存文件并强制退出vi 编辑
 :e! 放弃所有修改,从上次保存文件开始在编辑
source 文件/. 文件
 让当前脚本生效(修改后)
grep
 用于查找文件里符合条件的字符串
chmod
 赋予用户文件的读写执行权限
执行shell脚本(先要获取权限 chmod 777 文件名)
 1.当前目录下运行
 执行 ./test.sh
 2.绝对路径运行
 执行 /home/***/test.sh 
 3.当前目录下运行
 sh test.sh
 4.当前目录
 source/. tesh.sh
 5.当前目录
 /bin/bash test.sh
显示当前用户的环境变量
 env
定义、新增/修改/删除环境变量
 export VAR=10
 unset VAR
搜索查找环境变量中含有该变量名的字段
 env | grep 变量名
搜索查找环境变量中含有该变量名的值的字段
 env | grep $变量名
复制上一级文件夹的文件到当前目录
 cp ../文件名 .

/  根目录
~  家目录,用户的个人目录
./ 当前目录
../上级目录
exit 1 正常退出
exit 0 非正常退出
read file_name 从输入中读取一行,指定给file_name变量

cat
 cat主要有三大功能:
  1.一次显示整个文件。
    
  2.从键盘创建一个文件。
   $ cat  >  filename
   然后输入文本内容,退出可Ctrl+D
   只能创建新文件,不能编辑已有文件.
  3.将几个文件合并为一个文件。
   $cat   file1   file2  > file
more
 Linux的more命令类似 cat命令 ,不过more命令以一页一页的形式显示,更方便使用者逐页阅读。
 按空白键(space)就往下一页显示,按 b 键就会往回(back)一页显示,输入/+字符串可以搜索字符串(与vi搜索类似)。
egrep '正则表达式' 文件名
 会匹配文件名内容中符合正则的内容 

find命令     不能和管道结合使用
 find 目录 选项 参数    默认递归搜索
  -type
   find ./ -type f 搜索当前目录下的文件
  -size
   find ./ -size +20k -size -5M 搜索当前目录下文件或文件夹大小在20k到5M之间的
  -name
   find ./ -name "a" 寻找名为a的文件或者文件夹
  -maxdepth
   find ./ -maxdepth 2 -type f 搜索当前目录下的文件,递归到第二级子目录
  -exec
   find ./ -size +20k -size -5M -exec ls -l {} \;  对搜索的结果执行ls -l     -exec执行命令    \;表示转义
  -ok
   find ./ -size +20k -size -5M -ok rm -rf {} \; 会挨个儿先询问你是否删除,y表示删除,n表示不删除    -ok交互版的-exec
  | xargs
   find ./ -maxdepth 1 -type d | xargs ls -ldh   对find的结果进行分批处理,防止find的结果太大,内存溢出。以空格分批
  | xargs有个弊端,默认以空格对搜索结果进行分批,而linux可以创建名称带有空格的文件
  可以指定| xargs 的分割标记,并在每个搜索结果的末尾加上标记
  find ./ -type f -print0 | xargs -0 ls -lh


ls -ld 文件夹名  列出当前目录下指定文件夹信息
ls -ldh 文件夹名 列出当前目录下指定文件夹信息,包括大小

************************************************************************************************** 
shell 语法
 数据类型:String,只有一种,所以定义时可不写
 
 变量:全局变量----环境变量   定义export VAR=10
    局部变量----本地变量   定义VAR=10
    VAR=10   无空格,不然会报错,一般大写
    $变量名:取变量的值
    ${变量名}: 取变量的值(更安全)
    $(命令):取命令执行结果   例如$(date)    相当于`date`   (esc下面的那个键,反引号)
    $(())/$[]算数计算
        VAR=10
     $((VAR+5))=$[VAR+5]=$((${VAR}+5))
  
    2#10  2进制的10    2
    8#10  8进制的10    8
 
 转义字符  \   --
 续航符 \
 单引号和双引号:括字符串,双引号可以将变量展开,单引号不能
     echo '$VAR'    输出$VAR
     echo "$VAR"    输出VAR的值
 
 控制语句:
  执行命令  test或者[空格 条件  ]
  条件判别表达式:真返回0   假返回1
  $? 上一条命令的执行结果
   例如:  test ${VAR} -gt 100      [ ${VAR} -gt 100 ]   [为条件测试命令,后面有空格  不要理解为一对中括号
           echo $?
  整数判别符(只能用在整数之间):-eq等于    -ne不等于    -lt小于    -gt大于    -le小于等于    -ge大于等于
  文件类型判别符:
  [ -d dir ]  判断是否是目录    [ ! -d dir ]取反
  [ -f file]  判断是否是文件
  [ -p string] 管道
  [ -l string] 软连接
  [ -c string] 字符设备
  [ -b string] 块设备
  [ -s string] socket
  字符串长度判断:
  [ -z string]  不存在或者为空
  [ -n string]  长度不为0
  字符串判等:
   =
  !=
  逻辑运算:
   -a 逻辑与
   -o 逻辑或
   ! 逻辑非
  
        [ -d desktop -a "$VAR"="sjl"]   最好在$VAR上加上引号,避免VAR变量不存在
  [ -d desktop -a $VAR="sjl"] 不存在时编译为[ -d desktop -a ="sjl"],报错
  [ -d desktop -a "$VAR"="sjl"]不存在时编译为[ -d desktop -a ""="sjl"],不报错
 
 通配符:*  0个或多个字符 
           ? 1个字符
        [若干字符]  匹配方括号中的任意一个字符
   
 if语句
  if [ -f a.txt];then
  echo 'it is a file'
  fi
  ps:then相当于[ fi相当于]
     ;可省略,但是then要另提一行   ;相当于换行
    
 else语句
  #! /bin/sh
  echo '请输入文件名'
  read file_name
  if [ -f "$file_name"];then
   echo 'it is a file'
  elif [ -d "$file_name" ];then
   ehco 'it is a directory'
  else
     exit 1   (return;)
  fi
  
  if :;then echo "hello";fi           ;相当于换行  :表示空命令,相当于true
 
 case语句
  #! /bin/sh
  echo "Are you pig"
  read yes_or_no
  case "${yes_or_no}" in
  yes|Yes|YES|Y|y)
   echo "hello!pig!";;
  [nN][oO])
   echo "I am a cat!";;
  *)
   echo "I am a mouse!"
   return 1;;
  esac

 for循环,相当于foreach
  #! /bin/sh
  for FILENAME in `ls d?`;do mv $FILENAME $FILENAME~;done
  
  while循环
  #! /bin/sh
  echo "请输入密码"
  read PWD
  while [ "${PWD}" != "sjl" ];do
    echo "密码错误,请重新输入"
    read PWD
  done

 while循环2
  #! /bin/sh
  COUNT=1
  while [ $COUNT -lt 5 ];do
    echo "gcome on"
    COUNT=$(($COUNT+1))
  done

    break和continue
 break 跳出循环,可指定跳出几层循环 break[n]
 continue 跳过本次循环
 
 until循环,相当于do...while
 
 shell位置参数和特殊变量

  $0       可执行程序名,相当于C语言main函数的argv[0]  
  $1 $2 $3....位置参数,相当于argv[1],argv[2],argv[3]
  $#       相当于argv -1 ,相当于参数个数
  $@      表示参数列表(可以用做for的遍历),从$1开始
  $*        表示参数列表
  $?       上一条命令的exit status(0为真  非0为假)
  $$       当前进程号
  shift     会使参数列表右移
      shift 右移一位,$0不变,$2变为$1,$3变为$2...原来的$1丢弃
   shift 3 右移三位,$0不变。。。同上

  #! /bin/sh
  echo "the program $0 is now running"
  echo "the first parameter is $1"
  echo "the second parameter is $2"
  echo "the parameter list is $@"
  echo "the parameter list is $*"
  shift
  echo "the first paraneter is $1"
  echo "the second paranter is $2"
  echo "the parameter list is $@"
  echo "the parameter list is $*"

  [root@localhost ~]# . test.sh 11 22 33 44
  the program -bash is now running
  the first parameter is 11
  the second parameter is 22
  the parameter list is 11 22 33 44
  the parameter list is 11 22 33 44
  the first paraneter is 22
  the second paranter is 33
  the parameter list is 22 33 44
  the parameter list is 22 33 44
 
 输出指令
  1.printf
   printf  format-string  [arguments...]
   参数说明:
   format-string: 为格式控制字符串,例如 %s %c %d %f都是格式替代符
   arguments: 为参数列表。
   示例:
   !bin/bash
   # "%d %s\n"为format-string参数, 1为%d的参数, abc为%s的参数
   printf "%d %s\n" 1 "abc"
   输出:
   1 abc
  
  2.echo
   echo ""
   echo -e "" 开启转义
   echo -n "" 输出后不换行
   echo '' 原样输出
  
 管道
 可以通过|将一个命令的输出传递给另一个命令做输入
 
 tee
 输出执行结果并存储副本
 
 文件重定向
 cmd命令 > file   将输出重定向到文件中,原先文件存在会先删除,创建新文件
 cmd命令 >> file  将输出追加到文件中,不存在会创建,存在会追加
 
                    Linux标准文件描述符
  文件描述符             缩写              描述
  0                     STDIN    标准输入  <
  1      STDOUT    标准输出   >
  2      STDERR    标准错误输出  2>
 
 cmd命令 > file 2>&1  将标注错误输出重定向到1(标准输出)所指向的file中    &取地址符
 
 cat a.txt > b.txt   读取a.txt内容输出到b.txt  和  cat < a.txt > b.txt  达到的效果差不多
-----------------------函数-----------------------------------
 函数:
  无返回值和参数列表
  函数名(){
      函数体
  }
  示例1:
  #! /bin/sh
  foo(){            //左花括号和命令之间必须有空格或者换行
   for TEST in $@;do
   ls -ld $TEST
   done
  }
  foo $@   //传参
  
  示例2:
  f1(){
   echo $0
   echo $1
   echo $2
   echo $3
  }
  echo $0
  echo $1
  echo $2
  echo $3
  f1 11 22 33
  执行:test.sh aa bb cc
  输出:./test.sh
        aa
     bb
     cc
     ./test.sh
     11
     22
     33
  函数内部的$1..表示函数的第1..个参数,$0不变,为可执行程序名
 
 shell脚本调试:
 1.使用bash命令参数调试
  [root@ks ~]# sh [-nvx] test.sh
  参数说明:
  -n:不会执行该脚本,仅查询脚本语法是否有问题,并给出错误提示
  -v:在执行脚本时,先将脚本的内容输出到屏幕上,然后执行脚本。如果有错误,也会给出错误提示。
  -x:将执行的脚本内容及输出显示到屏幕上,这是对调试很有用的参数。

 
 面向对象:继承、重载、封装、多态
 框架:
 
---------------正则表达式-------------------
数量限定符
 . 匹配一个字符
 * 匹配多个字符
 [] 匹配指定范围的字符
 ^ 匹配除该符号后面的其他字符   在中括号内使用
 ? 0或1次
 + 一次或多次
 * 0次或多次
 {n} 匹配n次
 {n,} 匹配至少n次
 {,m} 最多匹配m次
 {n,m} 匹配n到m次
 grep匹配包含某一模式的行,而不是完全匹配

位置限定符
 ^ 行首的位置
 $ 行末的位置
 \< 单词开头的位置
 \> 单词结尾的位置
 特殊字符
 \ 转义字符
 () 单元符
 | 或符,连接表达式

grep 文本搜索工具
   (Basic正则)和egrep(Extended正则)
 用grep需要对正则中的一些符号进行转义,如?+{}|(),比较麻烦
 grep '^[0-9]\{1,3\}$'
 可用扩展正则
 egrep '^[0-9]{1,3}$'
 如果系统不支持egrep命令,可替换为grep -E '^[0-9]{1,3}$'

sed 在线编辑器,处理文件的行数据
 它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),
 接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。
 文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
 https://www.cnblogs.com/ginvip/p/6376049.html
 https://www.linuxprobe.com/linux-sed-command.html

awk 处理文本文件的一个应用程序,文本分析工具,处理文件的列数据
 它依次处理文件的每一行,并读取里面的每一个字段


 
 
 

猜你喜欢

转载自blog.csdn.net/shijiaolong0/article/details/84847927