linux shell编程基础

来源:互联网 发布:i.t是什么牌子 知乎 编辑:程序博客网 时间:2024/05/29 04:48

1.变量

1)变量的分类

  1. 用户自定义变量
  2. 环境变量:主要保存和系统操作环境相关的数据。
  3. 位置参数变量:主要用来向脚本当中传递参数或定义的
  4. 与定义变量:Bash中已经定义好的变量

2)用户自定义变量

  • 变量调用: echo $x
  • 变量设置: set
  • 变量删除: unset x

3)环境变量

设置环境变量
export 变量名=变量值

查看环境变量

  • set:查看所有变量
  • env:查看环境变量

3)位置参数变量

参数说明

参数 作用 $n n为数字,$0表示命令本身,$1-$9代表第一到第九个参数 $* 代表命令行中所有的参数,$*把所有的参数看成一个整体 $@ 命令行中所有参数,把每个参数区分 $# 代表命令行中所有参数的个数

例子:

#!/bin/bashecho "parameter is:   $* "echo "parameter also is: $@"echo "parameter number is: $#"echo "===============*==========="for i in  "$*"   do      echo "the parameters is:$i"   doneecho "===============@================="for i in "$@"   do      echo  "the parameter is:$i"   done

4)预定义变量

变量说明:

变量 作用 $? 最后一次执行命令返回状态,0 表示争取为执行 $$ 当前进程的PID $! 后台运行的最后一个进程的PID

read接收键盘输入

  • -p “提示信息” :在等待read输入时,输出提示信息
  • -t “秒数”:read命令会一直等待用户输入,指定等待时间
  • -n “字符数”:read命令只接受指定的字符数,就会执行
  • -s:隐藏输入的数据,适用于机密信息的输入

2.Shell运算符

1)declare申明变量类型

选项

  • -:给变量设定属性类型
  • +:取消变量的类型属性
  • -a:将变量申明为数组型
  • -i:整数型
  • -x:环境变量
  • -r:只读
  • -p:显示指定变量被声明的类型

2)“$((运算式)) 或“$[运算式]”

3.环境变量配置文件

1)source命令

重新加载配置文件

2)配置文件加载顺序

这里写图片描述

3)其他配置文件

  • ~/.bash_logout :退出登陆时加载的配置文件
  • ~/etc/issue : 登陆后的欢迎信息
  • ~/etc/motd : 登陆后的欢迎信息

正则表达式

1)基础正则表达式

元字符 作用 * 前一个字符匹配一个或者多个 . 匹配除了换行符外任意一个字符 ^ 匹配行首 例如”^hello” 匹配以”hello”开头的字符串 [] 匹配中括号中的任意一个字符,例如:[aeiou]匹配任意一个元音字母,[0-9]匹配任意一位数字 [^] 匹配除中括号字符以外的字符,例如[^0-9]匹配除了数字之外的字符 \ 转义符 {n} 表示前面一个字符出现n次,例如:[0-9]{4}匹配四位数字 {n,} 匹配前面一个字符不小于n次 {n,\m} 表示前面一个字符最少出现n次,最多出现m次

2)字符串截取命令

cut字段提取命令:

  • -f n:截取第n列
  • -d “”:确定分隔符

3)printf输出内容

输出类型:
- %ns:输出字符串 ,表示输出几个字符
- %ni:输出整数,n代表输出几个数字
- %m.nf:输出浮点数,m和n代表整数位数和小数位数

4)awk命令

格式:
awk ‘条件1{动作1}条件2{动作2}…’文件名

例子:

  • cat /etc/passwd | grep /bin/bash | awk 'BEGIN{FS=":"}{print $1 "\t" $3}'

5)sed命令

格式:
sed [选项] [动作] [文件名]
选项:
-n:只把经过sed处理过的行输出到屏幕
-e:允许对输入数据应用多条sed命令编辑
-i:用sed命令修改的结果直接修改读取的文件,而不是由屏幕输出

动作:

  • -a:追加,在当前行后添加一行或者多行
  • -c:行替换,用后面的字符串替换原数据行
  • -i:插入当前行插入一行或多行
  • -d:删除
  • -p:打印,输出指定的行
  • -s:字串替换

例子:

  • sed -n '2p' student.txt打印student.txt的第二行

  • sed '2,4d' student.txt删除第二到第四行

  • sed '2a test1 test1 test1 test1' student.txt 在第二行添加内容

  • sed '4c cang bugide' student.txt替换第四行

6)排序命令sort

格式:
sort [选项] 文件名

选项:

  • -f:忽略大小写
  • -n:以数值型进行排序
  • -r:反向排序
  • -t:指定分隔符(默认为制表符)
  • -k n[,m] :按照指定的字段范围排序

7)统计命令wc

格式:
wc [选项] 文件名

选项

  • -l:只统计行数
  • -w:只统计单词数
  • -m:只统计字符数

条件判断与流程控制

1判断条件

1)按照文件类型进行判断

常用测试选项 作用 -d 文件 判断给文件是否存在,并且是否为目录文件(是目录文件为真) -e 文件 判断文件是否存在(存在为真) -f 文件 判断文件是否存在,并且是否为普通文件(是普通文件为真)

2)按照文件权限进行判断

测试选项 作用 -r 文件 判断文件是否存在,并且是否该文件拥有读权限(有读权限为真) -w 文件 判断该文件是否存在,并且该文件是否拥有写权限(有写权限为真) -x 文件 判断该文件是否存在,并是否该文件拥有执行权限

3)两个文件进行比较

测试选项 作用 文件1 -nt 文件2 判断文件1的修改时间是否比文件2新(如果新则为真) 文件1 -ot 文件2 判断文件1的修改时间是否比文件2的旧(如果旧则为真) 文件1 -ef 文件2 判断文件1是否和文件2的Inode号一致

4)两个整数之间比较

测试选项 作用 整数1 -eq 整数2 判断整数1是否和整数2相等 -ne 判断不相等 -gt 大于 -lt 小于 -ge 大于等于 -le 小于等于

5)字符串的判断

测试选项 作用 -z 字符串 判断字符串是否为空(为空返回真) -n 字符串 判断字符串是否为非空 字符串1 == 字符串2 判断两个字符串是否相等 字符传1 != 字符串2 判断字符串1是否和字符串2不相等

2.条件判断的例子

判断磁盘利用率是否大于10%

#!/bin/bashtest=$( df -h | grep sda2 | awk '{print $5}' | cut -d "%" -f 1)if [ "$test" -gt 10 ]   then      echo "the use is greater 10%" fi

判断输入是否为文件

#!/bin/bashread -p "Please input a filename : "  fileif [ -z "$file" ]    then           echo "Error,please input filename"           exit 1elif [ ! -e "$file" ]    then         echo "Your input is not a file"         exit 2elif [ -f "$file" ]    then         echo "$file is a a regulare file"elif [ -d "$file" ]    then         echo "$file is a directory!!"fi

判断apache是否启动

#!/bin/bashtest=$(ps aux | grep httpd | grep -v grep)if [ -n "$test" ]    then       echo "$(date) httpd is ok!"  >> /tmp/autostart-acc.log    else       service httpd start  &> /dev/null       echo "$(date) reastart httpd !!" >> /tmp/autostart-err.logfi

case选择

#!/bin/bashecho "feng  : input 1" echo "fu  : input 2"echo "bo : inpit 3"read -t 30 -p "please input    " chocase "$cho" in     "1")          echo "feng"         ;;      "2")          echo "fu"         ;;      "3")          echo "bo"         ;;      *)          echo "please input right choice"         ;;esac

3 for循环例子

批量添加用户

#!/bin/bashread -p "Please input username   " -t 30 nameread -p "Please input the number of users    " -t 30 numread -p "Please input the password of users:" -t 30 passif [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]    then        y=$(echo $num | sed 's/[0-9]//g')    if [ -z "$y" ]         then            for((i=1;i<=$num;i=i+1))                do                  /usr/sbin/useradd  $name$i  &>/dev/null                  echo $pass | /usr/bin/passed --stdion $name$i &> /dev/null               done     fifi
0 0