shell 编程快速入门
shell 介绍
在计算机科学中,shell 是一个命令解释器,shell 脚本是 shell 编程的一种实现
shell 是位于操作系统和应用程序之间,是他们二者最主要的接口,shell 负责把应用程序的命令解释给操作系统,将操作系统处理后的结果解释给应用程序,所以,shell 相当于是应用程序与操作系统之间的媒介(翻译官的角色)
SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。linux 内一般是 bash,mac 是 zsh,然后还有 windows 的cmd,不过最近 windows 发布了完整内核的 linux 子系统 WSL 2
查看当前系统的 shell 类型:echo $SHELL
shell 脚本
定义:可执行的 linux 命令不在命令行下执行,而是通过一个文件执行时,称这个文件是 shell 脚本
一般用 vim 直接打开文件即可创建一个脚本,例如 vim start_service.sh 表示创建一个开启服务的脚本,脚本的内容自然是各种可执行的命令
#!/bin/bash echo 'start service~'
注释:单行使用 #,多行注释有两种方法,分别是 :<<! ... ! 和 :<<字符 ... 字符
#!/bin/bash echo '1' :<<! echo '3' echo '4' ! echo '5'
脚本执行方式:
bash /path/test.sh 使用 bash shell 执行脚本(脚本无可执行权限,或脚本内容首行没有指定 shell ,也可以用)
/path/test.sh 指定路径下执行脚本(需要脚本文件具有可执行权限)
source /path/test.sh 加载shell脚本文件内容,使shell脚本内容环境和当前用户环境一致
编写规范:
脚本首行必须指定脚本解释器:#!/bin/bash
首行后面要有脚本的基本信息等说明内容(常见的注释信息:脚本名称、脚本功能描述、脚本版本、脚本作者、联系方式等),尽量不要使用中文,防止乱码(linux服务器一般不支持中文)
代码编写规范,逻辑清晰
成对的内容一次性写出来,如:(), [], {}, ' ', " ", ` `
[ ] 中括号两端要有空格,编写时即可留出空格,然后再退格写内容
流程控制语句一次性写完,再添加具体内容
变量
变量分为本地变量,全局变量, shell 内置变量
本地变量是当前系统的某个环境下才能生效的变量,作用范围小,包含普通变量和命令变量
普通变量:
方式一:变量名=变量值 (变量值必须是一个整体,中间没有特殊字符)
方式二:变量名='变量值' (变量值是什么,就是什么)
方式三:变量名="变量值" (如果变量值中含有可解析的变量A,那么会先解析变量A,将A的结果和变量中其它值组成一个整体,重新赋值给左边的变量名)
命令变量:
方式一:变量名=$(命令) 推荐用法,执行命令,将结果赋值给左边的变量名
方式二:变量名=`命令` 是反引号,不推荐
全局变量是当前系统所有环境下都能生效的变量
查看全局变量命令:env
定义全局变量的三种方法:
export 变量=值 (这种定义是临时的,在关闭 shell 时失效)
[root@centos7 ~]# VALUE='global variabel' [root@centos7 ~]# export VALUE [root@centos7 ~]# env | grep 'VALUE' VALUE=global variabel [root@centos7 ~]# export VALUE_TWO='global variabel' [root@centos7 ~]# env | grep 'VALUE' VALUE=global variabel VALUE_TWO=global variabel [root@centos7 ~]#
设置永久的(对所有用户生效),用 vim 修改 /etc/profile 文件,添加变量
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
修改文件后,立即生效需要运行 source /etc/profile
设置永久的(对单一用户生效),用 vim 修改 ~/.bash_profile 文件,与上面操作一样
shell 内置变量
本地变量,全局变量都是需要先定义,然后使用,那么 shell 内置变量就是直接使用实现某种具体功能的,如:$0,$n,$#
$0 获取当前执行的 shell 脚本文件名,包括脚本路径
$n 获取当前执行的 shell 脚本的第 n 个参数值,n=1...9,当 n 为 0 时表示脚本的文件名,如果 n 大于 9 就要用大括号括起来 ${10}
$# 获取当前执行的 shell 脚本中参数的总个数
$? 获取执行上一个命令的返回值(0 为成功,非 0 为失败)
#!/bin/bash echo "my scripts name is:$0" # current args amount echo $# # get target args echo $1 echo $2 echo $3 echo $4 # excute result echo $? 执行效果 [root@centos7 shell_exercise]# bash remaks.sh a b c d my scripts name is:remaks.sh 4 a b c d 0 [root@centos7 shell_exercise]#
变量内容的截取(切片)
${变量名:起始位置:截取长度}
${file:0:5} 从第1个字符开始,截取5个字符 ${file::5} 从第1个字符开始,截取5个字符 ${file:5:5} 从第6个字符开始,截取5个字符 ${file:5} 从第6个字符开始,截取后面所有的字符 ${file:0-5} 从倒数第5个字符开始,截取后面所有的字符 ${file:0-6:3} 从倒数第6个字符开始,截取之后的3个字符
变量默认值
执行脚本时,往往会在脚本后面指定参数;但如果没有给定参数,那么可以设定默认值(类似于缺省参数)
场景一:执行脚本时,如给定了脚本中变量 a 的值,那么就将值赋予 $a,如果没有给定,那么在脚本中可以设定默认值
格式:${变量名:- 默认值}
如果我在命令后面补充了参数 n,那么输出内容是:receive args is n
如果我在命令后面没有补充参数,那么输出的内容是:receive args is 2
#!/bin/bash a=$1 echo "receive args is ${a:-2}"
场景二:无论是否给定变量 a 的值,都输出默认值(感觉这个没有意义)
格式:${变量名 + 默认值}
#!/bin/bash a=$1 echo "receive args a is ${a+666}"
变量的查看与删除
查看:
$变量名 在命令行 / 脚本中使用
"$变量名" 在命令行 / 脚本中使用
${变量名} echo "data access ${变量名} f "
"${变量名}" 推荐使用方式
删除: unset 变量名
,
export CLASSPATH=./JAVA_HOME/lib;$JAVA_HOME/jre/lib
修改文件后,立即生效需要运行 source /etc/profile
设置永久的(对单一用户生效),用 vim 修改 ~/.bash_profile 文件,与上面操作一样
