shell 学习笔记

 

多命令符
符号 格式 说明
; 命令1;命令2 命令1和命令2都会执行
&& 命令1&&命令2 逻辑与
|| 命令1||命令2 逻辑或





通配符
通配符 作用
匹配一个任意字符
* 匹任何内容
[] 匹配括号中的任意一个字符
[-] - 代表范围 [a-z] ,匹配a-z中的任意一个字符
[^] 逻辑或, 匹配非括号中的一个字符, [^0-9] 匹配一个非数字的字符







其他特殊符号
符号 作用
'' 表示 '' 中的所有特殊符号 没有特殊意义 如:$   \
"" $  ` \ 有特殊含义
`` 调用系统命令
$() 调用系统命令
# #开头注释
$ 调用变量   如:  $name
\ 转义符









变量分类
  用户自定义变量
  环境变量 :系统操作环境相关的变量
    设置环境变量 : export 变量名=变量值
    查询变量 : env
    删除变量 : unset 变量名
  位置参数变量:主要是用来向脚本当中传递参数或数据的,变量名不能自定义
    如:$n:n为数字 $0代表命令本身,$1-$9代表第一到第9个参数,十以上要用大括号包含 ${10},如同java中的变量替换
        test.sh
        -----------------
        #!/bin/bash
        $0
        $1
        -----------------
        执行 ./test.sh 123
        则 : $0:./test.sh 为命令本身,$1:123          

      $*:代表命令行中所有参数,$*把所有参数看做一个整体
      $@:代表命令行中的所有的参数,$@把每个参数区分对待
      $#:代表命令行中所有参数的个数
  预定义变量:是bash中已经定义好的变量  
      ------------------------------------------  
      预定义变量  |    作用
      ------------------------------------------
        $?    |  最后一次执行的命令的返回状态,若这个变量的值为0,证明上个命令正确执行,更像是错误码
      -------------------------------------------
        $$    |  当前进程的进程号(PID),像tomcat每次启动都可以保存进程号,然后执行停止脚本,找到这个进程号就可以关闭
      -------------------------------------------
        $!    |  后台运行的最后一个进程的进程号
      --------------------------------------------
set 查看所有 变量
  

特殊复制命令 dd

  dd if=输入文件 of=输出文件 bs=字节 count=个数
  if  //in file
  of  //out file
  bs  //binary stream,一次拷贝多少个字节
  count //一共拷贝多少次
  
后台执行 &
  示例 : ./test.sh &

接收键盘输入
  read [选项] [变量名]
    -p "提示信息"  //就想输入密码 给的提示
    -t 秒数    //等待时间
    -n 字符数   //接收指定的字符数
    -s      // 隐藏输入的数据, 就像密码 ****** 这样,但是linux中 直接为 不显示
  

 

数值运算 

声明变量类型
  declare [+/-][选项] 变量名
    -: 给变量设定类型属性
    +: 取消变量的类型属性
        -i: 将变量声明为整数型(integer)
        -x:将变量声明为环境变量
        -p: 显示指定变量的被声明的类型
   示例: aa=11
       bb=22
       declare -i cc=$aa+$bb
       echo cc 
  expr或let 数值运算工具
    dd=$(expr $aa + $bb) //把 $aa + $bb 的结果赋值给dd
  $((运算式)) 或 $[运算式]
    ff=$(($aa+$bb))
    gg=$[$aa+$bb]
  
### 运算 和 java 一样 ,支持 逻辑与 逻辑或等

 环境变量

  

source 配置文件   或者 .配置文件 //使修改的配置文件 直接生效

---------------      -------------------     ------------      --------------     ------------
| /etc/profile | -----> |~/.bash_profile | -----> | ~/.bashrc | -----> | /etc/bashrc | -----> | 命令提示符 |
---------------      -------------------     ------------      --------------     -------------
    |                                         |
    |    ----------------------                           |
    | ---> | /etc/profile.d/*.sh | <------------------------------------------|
         ----------------------
              |
             \|/
         ------------------------     ---------------------
         |/etc/profile.d/lang.sh | ---> |/etc/syscconfig/i18n|
         ------------------------- ---------------------

 

Shell登录信息

本地终端欢迎信息 /etc/issue
转义符 作用
\d 当前系统日期
\s 操作系统名称
\l 登录的终端号
\m 硬件体系结构 如i386、i686
\n 显示主机名
\o 显示域名
\r 显示内核版本
\t 显示当系统时间
\u 显示当前登录用户的序列号












远程终端欢迎信息 /etc/issue.net
  转义符不能使用(无效)
  由ssh的配置文件/etc/ssh/sshd_config决定是否显示issue.net配置的欢迎信息

登录后的欢迎信息 /etc/motd
  之前2个位登录前的信息 ,这个配置为登录成功之后的欢迎信息


正则表达式
  * . ^ $ [] [^] \ \{n\} \{n,\} \{n,m\}
##自己体会  

 

 

 字符截取命令

cut [选项] 文件名
  -f 列号   //提取第几列
  -d 分隔符  //按照指定分隔符分割列
  示例: cut -f 2,4 test.txt 提取test文件中的第二和第四列
## 文件要像表格一样,默认使用制表符分出每一列 使用 -d 指定 分隔符

printf '选项' 输出内容
  %ns   //输出字符串, n是数字指待输出几个字符
  %ni   //输出整数 n是数字指待输出几个数字
  %m.nf //输出浮点数 m和n是数字 如:%8.2f ,则输出8位 6位整数,2位小数

awk '条件1{动作1} 条件二{动作二} ...' 文件名
  条件:
    BEGIN     //先执行这个条件对应的动作
    END
    $6 >10    //第6列的数据大于10
  动作:
    格式输出
    流程控制语句
    {FS=":"}  //以 :作为分隔符
### awk '{printf $2 "\t" $6}' test.txt

sed命令 针对的是每一行
sed是一种几乎包括在所有unix平台的轻量级流编辑器,用来将数据进行选取、替换、删除、更新的命令
sed [选项] '[动作]' 文件名
  选项:
    -n: 一般sed会把所有数据输出到屏幕。-n只会把经过sed命令处理的行输出
    -e: 允许对输入数据应用多条sed命令编辑
    -i: 用sed的修改结果 直接修改读取数据的文件, 而不是由屏幕输出
  动作:
    a\: 追加,添加多行时,除最后一行外, 每行末尾 需要使用 \
    c\: 行替换 c后面的字符串,替换元数据行,除最后一行外,每行末尾 需要使用 \
    i\: 出入 当前行前插入一行或多行。除最后一行外,每行末尾需要使用 \
    d: 删除指定的行
    p: 打印指定的行
    s: 字符串替换, 用一个字符串替换另外一个字符串, 格式为"行范围s/旧字符串/新字符串/g"

## sed -n '2p' test.txt //只输出第二行
  sed '2,4d' test.txt //删除2-4行 文件里的内容不会被删除
  sed '2c 替换内容\' test.txt //替换第二行内容
  sed '3s/70/80/g' test.txt //把第三行70 替换为80 (源文件内容不会替换)
  sed -i '3s/70/80/g' test.txt //源文件中的内容 会被替换
  sed -e 's/70/80/g; s/zhangsan//g test.txt //70替换为80, zhangsan 替换为空字符串


排序命令 sort
  sort [选项] 文件名
    选项
      -f   //忽略大小写
      -n   //以数值型进行排序。默认是字符串型排序
      -f   //反向排序
      -t   //指定分隔符, 默认分隔是制表符
      -k n[,m] //按照指定的字段范围排序,从第n字段开始,[,m]字段结束(默认到行尾)例如 -k 3,5
      -r   //排序取反 z-a这样排序
## sort -n -t ":" -k 3,3 /etc/passwd //使用:分割 ,只用第三个字段,以数值型排序

统计命令 wc
  wc [选项] 文件名
    -l 统计行数   line
    -w 统计单词数  word
    -m 统计字符数

  

条件判断

 

特殊文件判断  test
  -b 文件 | 判断文件是否存在,且是否为块设备文件
  -c 文件 | 判断文件是否存在,且是否为字符设备文件
  -L 文件 | 判断文件是否存在,且是否为符号链接文件
  -S 文件 | 判断文件是否存在,且是否为套接字文件
  -d 文件 | 判断文件是否存在,且是否为目录文件
  -e 文件 | 判断文件是否存在,
  -f 文件 | 判断文件是否存在,且文件为普通文本
  -p 文件 | 判断文件是否存在,且是否为管道文件
  -s 文件 | 判断文件是否存在,且是否非空
  -z 文件 | 判断文件是否存在,且是否为空
  -r 文件 | 读权限 -w 写权限 -x 执行权限
## test -e /root/install.log 
## [-e /rooot/install.log] 
## 两种方式都可以, 需要使用$?  返回上一次执行的命令结果
## [-d /root] && echo "yes" || echo "no"

两个文件之间比较 

  文件1 -nt 文件二  // 比较 文件1 比 文件二 新 (new)(按修改时间比较)

[-z "aa" -a 1>2 ] && echo "yes" || echo "no"  // -a : and 

 

流程控制 

 

if 语句
  -------------------------
  if [ 条件判断式 ];then
    程序  
  fi
  -------------------------
  if [ 条件判断式 ]
    then
      程序
  elif [ 条件判断式 ]
    then
      程序
  else
    不成立时的程序
  fi
  ---------------------------
## [ 条件判断式 ] 有2个空格

case 语句
  ----------------------------------
  case $变量名 in
    "值1")
      执行1
      ;;
    "值2:)
      执行2
      ;;
     *)
      其他
      ;;
   esac 
  ---------------------------------------
for循环
  -----------------------------------------
  for 变量 in 值1 值2 值3 ...
     do
       程序
     done
  -----------------------------------------  
  for (( 初始值;循环控制条件;变量变化 ))
    do
      程序
    done

while 循环
  -----------------------
  while [条件判断式]
    do
      程序
    done
  ------------------------
until //条件不成立循环 ,直到条件成立
  ------------------------------
  until [条件判断式]
    do
      程序
    done
  -------------------------------

 

 

 

posted @ 2020-03-18 22:05  BigNew  阅读(150)  评论(0编辑  收藏  举报