Shell是一个环境,提供了对Linux系统的借口;向你接收输入,并根据输入执行程序,并显示程序的输出;可以运行我们的命令,程序和shell脚本
文章目录
引用一篇关于介绍shell中格式的帖子:Linux shell 中 ( ) ‘ ‘ , () ` `, ()‘‘,{},$[] $(()),[ ] (( )) [[ ]]作用与区别
一、shell脚本创建
shell脚本按照命令列表中列出的顺序执行
1、创建->编辑->保存
vi shell.sh
文件的第一行写#!/bin/bash
2、修改权限
增加x执行权限
chmod u+x shell.sh
3、执行
在当前目录下:./shell.sh #路径+脚本名
二、命令
1、控制台输出:
echo [-n] “...”
#加上-n则代表这一行输出不换行(默认不换行)
echo -e “...”
#加上-e则代表这一行支持转义,可以使用\t制表符等
#!/bin/bash
echo "hello kb10"
[root@chust01 shell]# ./three.sh
hello kb10
2、控制台输入
区分变量和命令,变量全部大写,$引用变量,可以直接写在命令里
echo -n "please enter your name =>"
read NAME
echo "your name is $NAME"
[root@chust01 ~]# ./shell/first.sh
please enter your name
aaa
your name is aaa
3、注释
(1) 单行注释在行前加#
(2) 段落注释:行前加:<<!
,行后加!
4、变量
数字、字母、下划线,一般字母大写
值可以是一个数字、文本、文件名、设备或任何其他类型的数据,不可以是指针
shell可以创建,分配和删除变量
(1) 创建
NAME=”henry”
AGE=18
(2) 使用
输出多个变量时需要在最外层加双引号,连同中间的间隔符一起输出
echo “$NAME,$AGE”
echo $NAME
(3) 取消
回收变量unset
unset NAME
echo "your name is $NAME"
5、常量
readonly#不能再赋值,再赋值会报错
readonly AGE=18
echo "age:18"
AGE=22
6、变量分类
(1) 局部变量:当前实例有效
(2) 环境变量:跨实例访问
当前登录有效的临时环境变量:临时环境变量
export -p#列出当前所有的环境变量
export -n VAR#删除
export VAR#添加变量到当前连接的环境变量中
还有一种是全局的环境变量,JAVA_HOME
(3)Shell变量
$$
当前shell进程编号
$0
当前脚本的名字路径
echo $0
.
$n
脚本参数,传入的值,输出
echo $1
echo $2
$#
脚本参数的数量
$*
脚本参数的完整集合(当成数组的格式存储)
$@
脚本参数的独立集合,不加双引号,和$*相同
加上””
则$*
代表整体,而$$@代表个体
$?
上一条命令的执行结果状态值或函数的返回值:0正常,1失败(不常用)
$!
上一条后台命令的进程号The process number of the last background command
7、数组
(1) 标准变量:一个变量存一个值,一个类型一个值
(2) 数组:支持不同类型的变量,可以在同一时间容纳多个值
加双引号:当做整体,一个字符串
不加双引号:空格
#创建赋值
echo ${NAME[*]}
在数组前加一个#,获取数组的长度
NAME=($NAME) #将符合数组特性的字符串转为数组
三、运算符
1、算数运算符
shell早期未设计算数,但可以使用外部程序awk或expr
expr与运算符和其他值之间【必须有空格】,所有的算术计算,使用长整数
#乘号需要转义 *,乘方是**
#不支持小数计算 + - * 、 % = ++ –
(1)VAL=`EXPR 2 + 2`
(2)let “VAL=2**3”
(3)VAL=$((2+3))
条件表达式
2、关系运算符
-eq -ne -lt -le -gt -ge
3、布尔运算符
! -o -a
[ 2 -lt 3 -o 5 -gt 3 ]
|| &&逻辑与非要用两层括号
[[ 2 < 3 || 5 > 3 ]]
用到了双分支:注意if语句里的空格,大于等于的两种写法
.
4、字符串运算符
#二元:== !=
在控制台输入引用的变量
5、正则:=~
[[ $var =~ PATTERN]]
#正则匹配
^ 开始
$ 结束
. 一个任意字符
[] 指定范围
\< 单词开始
\> 单词结束
\b 单词开始或结束
\B 单词非开始和结束
? {0,1}
+ {1,}
* (0,)
{m,n} 最少m,最多n
{m,} 最少m次
{,n} 最多n次
{f} 固定f次
\ 转义符
() 组合
| 或
6、一元:
-z(是否为空) $str(是否不为空)
7、文件测试操作(一元左置)
#-e -d -f -r -w -x -s(not empty)
-e file 检测文件(包括目录)是否存在
-d file 检测文件是否是目录
-f file 检测文件是否是普通文件(既不是目录,也不是设备文件)
-r file 检测文件是否可读
-w file 检测文件是否可写
-x file 检测文件是否可执行
-s file 检测文件是否为空(文件大小是否大于0)
-b file 检测文件是否是块设备文件
-c file 检测文件是否是字符设备文件。
-g file 检测文件是否设置了 SGID 位
-k file 检测文件是否设置了粘着位(Sticky Bit)
-p file 检测文件是否是有名管道
-u file 检测文件是否设置了 SUID 位
8、特殊表达式
`` <=> $()
命令替换符号,兼容性``更好
OUTPUT=`start-all.sh`
先执行start命令,执行完把结果赋值给OUTPUT,默认有线程等待,延时加载
(())
#算数加强版
控制台输入
$(()) <=> $[]
#算数运算,
(
(
)
)
里
的
变
量
可
以
不
加
(())里的变量可以不加
(())里的变量可以不加符号
[]
#test命令
[[]]
#字符串计算加强版# 可以用|| &&
${}
${STR#*WORD}
#从前往后匹配,删掉第一个WORD匹配到字符以及前面的字符;如果写两个#,则删除全部匹配到的之前的字符。可以用来获取文件名。
${STR%WORD*}
#从后往前匹配,和#号相反。可以用来获取文件路径和根目录。
${STR/WORD/REPLACE}
#替换STR中第一个匹配到WORD的值为REPLACE
${STR//WORD/REPLACE}
#替换STR中所有匹配到WORD的值为REPLACE
${STR:-DF_VALUE}
#若STR未赋值或为null,设置STR为第二个参数DU_VALUE
${ARRAY[IX]}
#获取数组ARRAY下标IX的元素
${#ARRAY[@]}
#获取数组ARRAY的长度