shell脚本是我们开发中经常需要用到的技能之一,我们经常在线上服务器执行脚本,比如服务启动脚本,所以掌握shell也是我们必备技能之一。下面先介绍下学习shell脚本之前一些需要了解的知识。
一.shell下的变量
变量对于程序员来说一定不会陌生,java中变量的使用频率也是非常高的。不过shell下的变量却有一些特殊的设置规则,下面来了解下。
我们可以使用echo命令来显示变量,但是变量在被显示时,前面必需加上字符$才可以,如我们想展示变量PATH的内容,可以echo $PATH 这很简单
对于变量的设置或修改来说,也很简单,用"等号(=)"连接变量与它的内容即可,如myname=test就将变量myname设置为test了
不过在设置变量时,需要符合某些规定,否则会设置失败,这些规则还是比较复杂的。
变量的设置规则
1.等号两边不能直接接空格符。我们日常开发中,为了代码规范会在等号两边加上空格,这个在shell下是不允许的
2.变量名称智能是英文字母和数组,开头字符不能是数字 如a2bc3是合理的 2abc3则不行
3.变量内容若有空格可使用单引号''或双引号""将变量内容结合起来,但是双引号内的特殊字符如$可以保有原来的特性,单引号中的特殊字符仅为一般字符
如var="lang is $LANG" echo $var结果为lang is en_US 即双引号下的$保有特性 $LANG为en_US
如果是var='lang is $LANG' echo $var结果则是lang is $LANG 单引号下的特殊字符仅为一般字符
4.可用转译字符"\"将特殊字符变成一般字符
5.在一串命令中,如果还需要通过其他命令提供的信息,可以使用反单引号"`命令`"或"$命令"
如想要取得内核版本的设置 version=$(uname-r) 在echo $version 可得内核版本
6.为变量增加内容 可用$变量名称累加内容 如PATH="$PATH":/home/bin
7.取消变量的方法为 unset 变量名称
从键盘读取变量可以使用read命令
read test 这时可以从键盘输入test变量的数据 然后可以使用test变量
二.通配符
* 代表0个到无穷多个任意字符
?代表一定有一个任意字符
[]同样代表一定有一个在中括号内的字符 例如[abcd]代表一定有一个字符,可能是a,b,c,d这四个任何一个。
[-]若有见好在中括号内时,代表在编码顺序内的所有字符。例如[0-9]代表0到9之间的所有数字,[a-z]代表a-z之间的所有字母。
[^]若中括号内的第一个字符为指数符号,那表示原向选择,例如[^abc]代表一定有一个字符,只要是非abc多其他字符都可以。
我们平常也会使用这些通配符
如ll /home/bin/a* 查看bin下面所有以a开头的文件名
ll /etc/????? 找出etc下面文件名刚好是5个字母的文件名
ll /etc/*[0-9]* 找出etc下面文件名含有数字的文件名
三.特殊符号
# 注释符号 后面的数据均不执行
\ 转译符号 将特殊字符或通配符还原成一般字符
| 管道 分隔两个管道命令的界定
; 连续命令执行分隔符
~ 用户的主文件夹
$ 使用变量前导符
& 作业控制 将命令变成背景下工作
! 逻辑运算意义上的“非”
/ 目录符号 路径分隔符号
>,>> 数据流重定向 输出导向
<,<< 数据流重定向 输入导向
‘’ 单引号 不具有变量置换的功能
"" 双引号 具有变量置换的功能
`` 两个`中间为可以先执行的命令 也可以使用$()
() 在中间为子shell的起始与结束
一.shell下的变量
变量对于程序员来说一定不会陌生,java中变量的使用频率也是非常高的。不过shell下的变量却有一些特殊的设置规则,下面来了解下。
我们可以使用echo命令来显示变量,但是变量在被显示时,前面必需加上字符$才可以,如我们想展示变量PATH的内容,可以echo $PATH 这很简单
对于变量的设置或修改来说,也很简单,用"等号(=)"连接变量与它的内容即可,如myname=test就将变量myname设置为test了
不过在设置变量时,需要符合某些规定,否则会设置失败,这些规则还是比较复杂的。
变量的设置规则
1.等号两边不能直接接空格符。我们日常开发中,为了代码规范会在等号两边加上空格,这个在shell下是不允许的
2.变量名称智能是英文字母和数组,开头字符不能是数字 如a2bc3是合理的 2abc3则不行
3.变量内容若有空格可使用单引号''或双引号""将变量内容结合起来,但是双引号内的特殊字符如$可以保有原来的特性,单引号中的特殊字符仅为一般字符
如var="lang is $LANG" echo $var结果为lang is en_US 即双引号下的$保有特性 $LANG为en_US
如果是var='lang is $LANG' echo $var结果则是lang is $LANG 单引号下的特殊字符仅为一般字符
4.可用转译字符"\"将特殊字符变成一般字符
5.在一串命令中,如果还需要通过其他命令提供的信息,可以使用反单引号"`命令`"或"$命令"
如想要取得内核版本的设置 version=$(uname-r) 在echo $version 可得内核版本
6.为变量增加内容 可用$变量名称累加内容 如PATH="$PATH":/home/bin
7.取消变量的方法为 unset 变量名称
从键盘读取变量可以使用read命令
read test 这时可以从键盘输入test变量的数据 然后可以使用test变量
二.通配符
* 代表0个到无穷多个任意字符
?代表一定有一个任意字符
[]同样代表一定有一个在中括号内的字符 例如[abcd]代表一定有一个字符,可能是a,b,c,d这四个任何一个。
[-]若有见好在中括号内时,代表在编码顺序内的所有字符。例如[0-9]代表0到9之间的所有数字,[a-z]代表a-z之间的所有字母。
[^]若中括号内的第一个字符为指数符号,那表示原向选择,例如[^abc]代表一定有一个字符,只要是非abc多其他字符都可以。
我们平常也会使用这些通配符
如ll /home/bin/a* 查看bin下面所有以a开头的文件名
ll /etc/????? 找出etc下面文件名刚好是5个字母的文件名
ll /etc/*[0-9]* 找出etc下面文件名含有数字的文件名
三.特殊符号
# 注释符号 后面的数据均不执行
\ 转译符号 将特殊字符或通配符还原成一般字符
| 管道 分隔两个管道命令的界定
; 连续命令执行分隔符
~ 用户的主文件夹
$ 使用变量前导符
& 作业控制 将命令变成背景下工作
! 逻辑运算意义上的“非”
/ 目录符号 路径分隔符号
>,>> 数据流重定向 输出导向
<,<< 数据流重定向 输入导向
‘’ 单引号 不具有变量置换的功能
"" 双引号 具有变量置换的功能
`` 两个`中间为可以先执行的命令 也可以使用$()
() 在中间为子shell的起始与结束
{} 在中间为命令块的组合
参考自:linux鸟哥的私房菜