【新手】shell编程简介及快速入门

shell

操作系统是对软硬件资源进行管理,内存管理、文件管理、CPU管理、进程管理等。linux最核心的对硬件管理就是linux的内核,而内核之外提供了一层壳,即shell,可以让程序员通过shell去调用内核,操纵硬件。

shell文件一般为.sh,启动方式:

# 新开一个bash(即子bash)来运行shell脚本 
./a.sh  
bash a.sh
#在当前bash运行shell脚本
. a.sh #注意空格
source a.sh #注意空格
#若没有运行权限, chmod+x a.sh

第一章:shell变量

  1. shell变量名由字母、下划线、数字组成,变量名不能以数字开头。

  2. shell定义的变量时=两端不能有空格

  3. shell定义的变量默认是局部变量,可以使用export将其升级为全局变量。

  4. env查看系统变量,set查看用户定义的变量。env | grep my_var .

  5. unset释放用户定义的变量。

  6. readonly a=99定义只读变量,不能修改;只读变量不能被unset。

  7. 特殊变量

    # $n
    $0 #脚本的名称与路径
    $1 #脚本的第一个参数
    $9 #脚本的第九个参数
    ${10} #脚本的第十个参数
    $*  #得到所有参数,并将其视为一个字符串。加""后就不能单个遍历了哦
    $@  #得到所有参数,将其视为一个数组,可以遍历的哦
    $?  #返回上一条指令的执行状态
    $#  #表示参数的个数
    
  8. 系统变量的用法

    echo $HOME
    echo $PWD
    echo $USER
    A=1
    echo A
    A=$((1+5))
    A=$[1+5]
    

第二章:运算符

#!/bin/bash
sum=${$1 + $2}
echo $sum

#$[]  $(())  运算符计算的常用方式

a=$[ 5 * 3 ]
a=$((5 * 3))
a=`expr 5 \* 3`


第三章:判断语句

  1. 字符串的判断
a=hello
test a=hello #用test很麻烦可以用[]替换 判断为真返回0 ,判断为假返回1
echo $?

[ $a = hello ] #注意[ ] 两头有空格,等号两端有空格
echo $?
[ $a != Hello] 
echo $?
  1. 常用的其他判断

    1. 两个之间比较(在shell中<是输入重定向,>是输出重定)

      -eq 等于equal -nq 不等于 not equal

      -lt 小于 less than -le 小于等于 less equal

      -gt 大于 greater then -ge大于等于greater equal

      [ 5 -lt 9 ]
      echo $?
      [ 5 -le 9 ]
      echo $?
      [ 5 -eq 9]
      echo $?
      
      [ 9 -gt 2 ]
      echo $?
      

​ 2. 文件权限进行判断

​ -r 有读权限read

​ -w 有写权限write

​ -x 有执行权限execute

touch test
touch hello
chmod +x hello
[ -r test ]
echo $?
[ -x test ]
echo $?
[ -x hello ]
echo $?

​ 3. 文件类型进行判断

​ -e 文件存在existence

​ -f 文件存在并且是一个常规文件file

​ -d 文件存在并且是一个目录directory

touch test
mkdir testDir
[ -e test ]
echo $?
[ -e test22 ]
echo $?
[ -f test ]
echo $?
[ -f testDir ]
echo $?
[ -d test ]
echo $?
[ -d testDir ]
echo $?
		4. 多条件判断(&&  || ,&&是上一条指令执行成功才执行后一条指令,||是上一条指令执行失败才执行后一条指令)
[ 5 -lt 9 ] && [ 9 -ge 20 ] && echo Ok || echo NotOk

第四章:流程控制

流程控制一般分为:顺序流程、分支流程、循环流程。

  1. 分支流程

    #; shell中如果一行要写多个命令可以用;分开 就是直接顺序执行就可以了。
    #if但分值
    if [ ]; then
    #shell 命令
    fi
    
    if []
    then
    #shell 命令
    fi
    # -a表示and与 [ 9 -gt 3 -a 33 -le 11] 
    # -o表示or或  [ 9 -gt 3 -o 33 -le 11]
    #if 多分支
    if[ ]
    then
    shell代码
    elif []
    then
    shell代码
    else
    shell代码
    if
    
    #例子
    echo $0
    if [ "$1"x = "hello"x ] #很常见的一个方法,字符串拼接
    then
    	echo "hello shell"
    fi
    
    if [ $2 -ge 0 -a $2 -lt 10 ] 
    then
    	echo "-ge 0"
    elif [ $2 -ge 10 -a $2 -lt 20 ]
    then
    	echo "-ge 10"
    else
    	echo "-ge 20"
    fi
    
    
    #case 多分支 )很重要 ;;也很重要
    
    case $3 in
    1)
    	echo "one"
    ;;
    2)
    	echo "two"
    ;;
    3)
    	echo "three"
    ;;
    *)
    	echo "else number"
    ;;
    esac
    
  2. for循环 与while循环

    #for循环 语法1
    for(( 初始值;循环控制条件;变量变化 ))
    do
    	程序
    done
    
    for (( i=1; i<=$1;i++ ))
    do 
    	sum=$[ $sum + $i ]
    done
    echo $sum
    
    #for循环 语法2
    for 变量 in 值1 值2....
    do
    	程序
    done
    
    for os in linux windows macos; do echo $os ;done
    for i int {1..100};do echo $i; done  #{}表示一个序列,两个.就够了。
    
    #来看看$* 和 $@的却别
    
    #!/bin/bash
    
    echo $0
    for i in $*
    do 
    	echo $i
    done
    
    for i in $@
    do
    	echo $i
    done
    
    for i in "$*"
    do 
    	echo $i
    done
    
    for i in "$@"
    do 
    	echo $i
    done
    ###################################
    while [ 判断条件 ]
    do
    done
    
    a=1
    while [ $a -le $1]
    do 
    	$sum2=$[ $sum2 + $a ]
    	a=$[ $a + 1 ]
    done 
    echo $sum2
    

    第五章: read读控制台输入

    read实现shell编程的IO交互,特别是读数据哈,echo实现输出。

    read (选项) (参数)

    选项:

    ​ -p 提示字符串

    ​ -t 超时等待时间

    参数:

    ​ 接受输入变量的参数

read -t 10 -p "请输入您的姓名:" num
echo "Hello, " $num "!"

第六章:函数

  1. 系统函数 (就是linux内核提供的一些命令)

    basename和dirname

    #!/bin/bash
    
    echo $(date)          #$() 里面调用命令、函数
    echo $(date +%s)
    
    filename="$1"_log_$(date)  #log文件常见命令方法
    
    echo filename
    
    echo file name : $(basename $0)
    echo file name : $(basename $0 .sh)
    cd $(dirname $0)
    echo file path : $(pwd)
    
    echo file path : $(cd $(dirname $0); pwd)
    
    
  2. 自定义函数

    ​ 调用之前必须定义函数。返回值return,若没有return将返回最后一条命令的运行结果。

    #!/bin/bash
    
    function add()
    {
    	s=$[ $1 + $2 ]
    	echo "和:" $s
    }
    
    read -p "请输入第一个整数" a
    read -p "请输入第二个整数" b
    add $a $b
    
    #########################################
    
    #!/bin/bash
    
    function add(){
    	s=$[ $1 + $2 ]
    	echo $s
    }
    
    read -p "请输入第一个整数" a
    read -p "请输入第二个整数" b
    
    sum=$(add $a $b)
    echo "和:"$sum
    
    
    
    

第七章:正则表达式

正则表达使用单个字符串来描述、匹配一些列符合某个语法规则的字符串。在linux中,grep、sed、awk等文本处理工具都支持正则表达式进行模式匹配。

  1. 常规匹配

    ps -aux | grep 1316

  2. 常用特殊字符

    1) ^匹配一行的开头,如

    ^abc 就是匹配所有以abc开头的一行。

    2) $匹配一行的结尾,例如

    abc$就是匹配所有以abc结尾的一行。

    cat hello.sh | grep -n ^$ #匹配空行,可以显示空行的行号

    3) .通配符,表示任何字符,如

    ​ a.b ,可以匹配所有a任意字符b 的字符串

    ​ a…b

    a…b

    4) *任意次数通配符,要与前一个字符配合使用

    ​ a*,a出现任意次,可以为0次可以为n次。

    思考.*就是任意字符,出现任意次!就是可以匹配多个字符嘛。

    ^a.*a$ 
    ^a.*b.*a$
    

    5) 字符区间[ ]

    [ ] 表示匹配某个范围内的一个字符。

    [6,9]
    [0-9]
    [0-9]*
    [a-z]
    [a-z]* #任意长度的 小写字母字符串
    [a-c,f-z]
    

    5) 转意符\

    cat hello.sh | '\$'
    cat hello.sh | '/\$'
    

    实例:手机号匹配

    echo "18328018088"  | grep ^1[34578][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]$
    echo "18328018088" | grep -E ^1[345678][0-9]{9}$
    

    第八章:文本处理工具

    1. cut。cut命令从文件的每一个行剪切字节、字符和字段并将这些字节、字符和字段输出。

      -f :列号,提取第几列

      -d:分隔符,按照指定分隔符分割列,默认是制表符“\t”

      -c:按照字符切割

      cut -f 1 -d " " cut.txt
      cat cut.txt | cut -f 1 -d " "
      cat /etc/passwd | grep bash$ | cut -d ":" -f 1,6,7
      cat /etc/passwd | grep bash$ | cut -d ":" -f 1-4
      ifconfg ens33 | grep netmask | cut -d " " -f 10
      
  3. awk

    一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开部分再进行分析处理。

    awk [选项参数] ‘/pattern1/{action} /pattern2/{action}…’ filename

    ​ pattern: 表示awd在数据中查找的内容,匹配模式,就是正则。

    ​ action:在查找匹配内容时所执行的一些列命令。

    ​ -F 指定输入文件分隔符

    ​ -v 赋值一个用户定义变量

cat /etc/passwd | grep ^root | cut -d ":" -f 7

cat /etc/passwd | awk -F ":" '/^root/{print $7}'

cat /etc/passwd | awk -F ":" '/^root/{print $1","$7}'

cat /etc/passwd | awk -F ":" 'BEGIN{"user ,shell"}{print $1","$7} END{print "end of file"}'

cat /etc/passwd | awk -F ":" '{print $3}'
cat /etc/passwd | awk -F ":" '{print $3+1}'

cat /etc/passwd | awk -v i=1 -F ":" '{print $3+i}'

cat /etc/passwd | awk -F ":" '{print "文件名:" FILENAME " 行号: " NR " 列号: " NF}'

awk -F ":" '{print "文件名:" FILENAME " 行号: " NR " 列号: " NF}' /etc/passwd

awk的内置变量:

​ FILENAME: 文件名

​ NR:行号

​ NF:列号

综合应用案例

1.归档文件

linux的归档命令 tar,-c表示归档,加上-z表示同时进行压缩,得到的文件后缀为.tar.gz;-f表示归档过程可视化

#! /bin/bash
#首先参数个数判断 是否为1
if [ $# -eq 1 ]
then 
	echo "参数不对,应该输入一个参数,作为待归档的目录"
	exit
fi
#从删除中获得目录名称
if [ -d $1 ]
then
	echo
else
	echo
	echo "目录不存在"
	exit
fi
DIR_NAME=$(basename $1)  #$符号 实现命令替换 和 使用变量
DIR_PATH=$(cd $(dirname $1); pwd)
#获取当前日期
DATE=$(date +%y%m%d)
#定义生成归档文件名称
FILE=archive_${DIR_NAME}_${DATE}.tar.gz
DEST=/root/archive/$FILE

echo
echo "开始归档"
tar -zgf $DEST $DIR_PATH/$DIR_NAME
if [ $? -eq 0 ]
then
	echo
	echo "归档失败!"
else
	echo
	echo "归档成功!"
fi

exit
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值