Shell 编程进阶笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/codejas/article/details/78902214

这几篇博文主要记录博主的Linux 学习之路,用作以后回顾和参考。大家可以选择略过也可以作参考。

(一)Linux 初步笔记
(二)Linux 进阶笔记(一)
(三)Linux 进阶笔记(二)
(四)Shell 编程进阶笔记

Shell 变量

(一)bash 变量与变量分类

变量的分类:

  • 用户自定义变量:用户根据自己的需求定义的变量可以根据需求修改
  • 环境变量:主要保存的是和系统操作环境相关的数据,对系统生效的环境变量名和变量作用是固定的
  • 位置参数变量:这种变量主要是用来向脚本当中传递参数或数据的,变量名不能自定义,并且作用是固定的
  • 预定义变量:是bash 中已经定义好的变量,变量名不能自定义,并且作用是固定的

用户自定义变量:

[变量名]=[变量值] : -> 注意两边不要有空格,如果变量中有空格需要加双引号
echo $[变量名] : -> 变量调用
[变量名]=“$[变量名]”[叠加值] : -> 变量的叠加
[变量名]=${[变量名]}[叠加值] : -> 变量的叠加
set : -> 所有变量的查看
set -u : -> 执行此命令后如果调用未声明的变量时会报错
unset [变量名] : -> 删除变量

bash 环境变量:

export [变量名]=[变量值] : -> 定义一个环境变量
env : -> 查看环境变量

环境变量与自定义变量的区别:
      环境变量时全局变量,而用户自定义变量是局部变量。用户自定义的变量只在当前的Shell 中生效,环境变量会在当前Shell 和这个Shell 的子Shell 中生效。环境变量可以自定义,但是对系统生效的环境变量是固定的。

位置参数变量:

预定义变量:

bash 语系变量:

locale : -> 查看当前系统语系
echo $LANG : -> 输出系统当前语系

(二)接收键盘输入

相关命令:

read [选项] [变量名]
选项:

  • -p “提示信息” : -> 在等待输入之前进行信息提示
  • -t [秒数] : -> 在等待用户输入的时候,防止一直等待输入
  • -n [字符数] : -> read 命令只接收指定的字符数,接收完成便会进行下一步
  • -s : -> 隐藏输入的数据,就像终端输入用户密码一样

Shell 运算符

(一)declare 声明变量类型

declare [+/-] [选项] [变量名]=[变量值]
选项:

  • -:给变量设定类型属性
  • +:取消变量的类型属性
  • -a:将变量声明为数组
  • -i:将变量声明为Integer 类型
  • -x:将变量声明为环境变量,和export 作用类似
  • -r:将变量声明为只读属性

declare -p : ->查询所有变量的属性
declare -p [变量名] : -> 查询指定变量的属性

一个简单的小应用实现运算:

[root@localhost ~]# declare -i  a=1
[root@localhost ~]# declare -i  b=2
[root@localhost ~]# declare -i sum=$a+$b
[root@localhost ~]# echo $sum
3

(二)数值运算的方法

一:如上使用declare 将变量声明为Integer 类型再进行运算
二:使用 expr 或let 进行运算

[root@localhost ~]# a=2
[root@localhost ~]# b=3
[root@localhost ~]# c=$(expr $a + $b)
[root@localhost ~]# echo $c
5

[root@localhost ~]# let d=$a+$b
[root@localhost ~]# echo $d
5

三:”(())$[运算式]”

[root@localhost ~]# e=$(( $a + $b ))
[root@localhost ~]# echo $e
5

Shell 编程之环境变量配置文件

source 相关命令

source [配置文件] : ->修改系统配置文件后,必须注销用户才可以生效,使用source 命令不用注销重新登录用户
. [配置文件]

放张图在这里供以后作参考

Shell 编程之正则

(一)正则表达式

正则表达式与通配符的区别:

  • 正则表达式用来在文件中匹配符合条件的字符串,是包含匹配。grep、awk、sed、等命令支持正则表达式
  • 通配符用来匹配符合条件的文件名,通配符是完全匹配。

正则匹配规则:

(二)字符串截取

cut 相关命令:

cut [选项] [文件名]
选项:

  • -f [列号] : -> 提取第几列的数据
  • -d [分隔符] : -> 指定按照指定分隔符截取数据,默认使用制表符截取数据

简单例子:

[root@localhost ~]# grep "/bin/bash" /etc/passwd
root:x:0:0:root:/root:/bin/bash
Jas:x:500:500:Jas Zhang:/home/Jas:/bin/bash

[root@localhost ~]# grep "/bin/bash" /etc/passwd | grep -v "root"
Jas:x:500:500:Jas Zhang:/home/Jas:/bin/bash

[root@localhost ~]# grep "/bin/bash" /etc/passwd | grep -v "root" | cut -f 1 -d ":"
Jas

awk 相关命令:

awk ‘[条件一]{[动作一]}[条件二]{[动作二]}…’ [文件名]
条件(Pattern ): 一般使用关系表达式作为条件
动作(Action): 一般用于格式化输出

简单示例一(没有执行条件):

[root@localhost ~]# df -h
文件系统          容量  已用  可用 已用%% 挂载点
/dev/sda5              17G  5.2G   11G  33% /
tmpfs                 499M  276K  499M   1% /dev/shm
/dev/sda1             194M   28M  156M  16% /boot
/dev/sda2             2.0G  240M  1.6G  13% /home
/dev/sr0              4.0G  4.0G     0 100% /media/CentOS_6.3_Final
[root@localhost ~]# df -h | awk '{print$1 "\t" $2}'
文件系统    容量
/dev/sda5   17G
tmpfs   499M
/dev/sda1   194M
/dev/sda2   2.0G
/dev/sr0    4.0G

简单示例二(带有执行条件):

[root@localhost ~]# df -h | awk 'BEGIN{print "check begin"} {print$1 "\t" $2} END{print "check end"}'
check begin
文件系统    容量
/dev/sda5   17G
tmpfs   499M
/dev/sda1   194M
/dev/sda2   2.0G
/dev/sr0    4.0G
check end

简单示例三(FS内置对象指定分隔符,并使用BEGIN 条件)

[root@localhost ~]# cat /etc/passwd | grep "/bin/bash" |  awk '{FS=":"} {print $1 "\t" $2}'
root:x:0:0:root:/root:/bin/bash 
Jas x

[root@localhost ~]# cat /etc/passwd | grep "/bin/bash" |  awk 'BEGIN{FS=":"} {print $1 "\t" $2}'
root    x
Jas     x

sed 相关命令:

sed [选项] ‘[动作]’ [文件名]
选项:

  • -n :一般sed 命令会把所有的数据都输出到屏幕上,-n 只会把经过sed 命令处理后得到的数据进行输出
  • -e :允许对输入数据应用多条sed 命令编辑
  • -i :用sed 命令的修改结果直接修改原文件,而不再输出到屏幕

动作:

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

简单示例:

[root@localhost ~]# df -h
文件系统          容量  已用  可用 已用%% 挂载点
/dev/sda5              17G  5.2G   11G  33% /
tmpfs                 499M  276K  499M   1% /dev/shm
/dev/sda1             194M   28M  156M  16% /boot
/dev/sda2             2.0G  240M  1.6G  13% /home
/dev/sr0              4.0G  4.0G     0 100% /media/CentOS_6.3_Final
[root@localhost ~]# df -h | sed -n '1p'
文件系统          容量  已用  可用 已用%% 挂载点

(三)字符处理

sort排序命令:

sort [选项] [文件名]
选项:

  • -f :忽略大小写
  • -n :以整型数值排序,默认使用字符串排序
  • -r :反向排序
  • -t :指定分隔符,默认的分隔符是制表符
  • -k “m,n”:按照指定的字段范围进行排序

简单示例:

[root@localhost ~]# df -h | sort
/dev/sda1             194M   28M  156M  16% /boot
/dev/sda2             2.0G  240M  1.6G  13% /home
/dev/sda5              17G  5.2G   11G  33% /
/dev/sr0              4.0G  4.0G     0 100% /media/CentOS_6.3_Final
tmpfs                 499M  276K  499M   1% /dev/shm
文件系统          容量  已用  可用 已用%% 挂载点

[root@localhost ~]# df -h | sort -r
文件系统          容量  已用  可用 已用%% 挂载点
tmpfs                 499M  276K  499M   1% /dev/shm
/dev/sr0              4.0G  4.0G     0 100% /media/CentOS_6.3_Final
/dev/sda5              17G  5.2G   11G  33% /
/dev/sda2             2.0G  240M  1.6G  13% /home
/dev/sda1             194M   28M  156M  16% /boot

[root@localhost ~]# df -h | sort -n -k "5,5"
文件系统          容量  已用  可用 已用%% 挂载点
tmpfs                 499M  276K  499M   1% /dev/shm
/dev/sda2             2.0G  240M  1.6G  13% /home
/dev/sda1             194M   28M  156M  16% /boot
/dev/sda5              17G  5.2G   11G  33% /
/dev/sr0              4.0G  4.0G     0 100% /media/CentOS_6.3_Final
wc 统计命令:

wc [选项] [文件名]
选项:

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

Shell Script

(一)简单if 条件语句

简单用例(一):判断当前用户是不是root

[root@localhost ~]# echo $USER
root
[root@localhost ~]# vim test.sh
#!/bin/bash

test=$USER

if [ "$test" == "root" ]
    then
    echo "I'm root"
else
    echo "I'm not root"
fi

[root@localhost ~]# bash test.sh 
I'm root

简单用例(二):判断用户输入的字符串是不是一个目录

[root@localhost ~]# vim test.sh
#!/bin/bash

read -p "please input a dir: " dir

if [ -d "$dir" ]
         then
         echo "It's a dir"
else
         echo "It's not a dir"
fi

[root@localhost ~]# bash test.sh 
please input a dir: /root
It's a dir
[root@localhost ~]# bash test.sh 
please input a dir: /root123               
It's not a dir

(二)case 语句

简单用例:

[root@localhost ~]# vim test.sh
 #!/bin/#!/bin/bash
 # 练习 case 语句的使用

 read -p "Please confirm to formate the disk (Y/N) : " input

 case "$input" in
     "Y") echo 'Your choosen is Y';;
     "N") echo 'Your choosen is N';;
     *)

     echo 'Error!'
;;

esac

[root@localhost ~]# bash test.sh 
Please confirm to formate the disk (Y/N) : Y
Your choosen is Y
[root@localhost ~]# bash test.sh 
Please confirm to formate the disk (Y/N) : N
Your choosen is N
[root@localhost ~]# bash test.sh 
Please confirm to formate the disk (Y/N) : a
Error!

(三)for 语句


简单用例(求和):

[root@localhost ~]# vim test.sh
   #!/bin/#!/bin/bash

   sum=0

   for(( i=0;i<=100;i++))
           do
                   sum=$(( $sum+$i ))
           done

 echo $sum


[root@localhost ~]# bash test.sh 
5050

(四)while 与 until 语句


while 与 until 语句的区别是while 中的条件判断为真时才进行循环,until 是判断条件为假时进行循环

展开阅读全文

没有更多推荐了,返回首页