1.查看linux可用的shell
cat /etc/shells
2.查看linux默认的shell
echo $SHELL
echo是一个shell命令
SHELL是shell的环境变量
3.shell提示符
普通用户
base shell提示是$符号
超级用户(root)
base shell提示是#符号
[root@1fce913333e2 ~]
root 当前用户
1fce913333e2 当前主机名称
~ 当前目录
Shell 通过PS1和PS2两个环境变量来控制提示符格式:
PS1 控制最外层命令行的提示符格式。
PS2 控制第二层命令行的提示符格式。
echo $PS1 :
[\u@\h \W]$
\u 当前用户
\h 当前主机名称
\W 当前目录
PS2 是命令行提示符
echo "asd
asd
asd
"
以上情况,在一行命令没有输入完成情况下的提示符
4.第一个shell脚本
#!/bin/bash --> #!约定标记,告诉系统该脚本需要什么解释器来执行 /bin/bash 具体解释器位置
echo “Hello World !” #这是一条语句
echo (Standard Output, stdout,一般指终端) :向标准文件输出文本
read (Standard Input, stdin) : 从标准输入文件读取用户输入的数据
#!/bin/bash
echo “What is your name?”
read PERSON
echo “Hello, $PERSON”
5.执行脚本
chmod +x test.sh
给test.sh文件加可执行权限
. ./test.sh -->执行没有执行权限的脚本文件
source test.sh -->使用source执行test.sh文件
作为解释器参数执行脚本:
/bin/bash test.sh
6.Shell变量
shell定义变量不需要指定类型,直接赋值就可以
bash shell中,每一个变量都是字符串,没有使用引号,值也会被当作字符串存储
variable_name=value
若value中不包含空格或者tab那么不需要加引号,否则一定要加引号
赋值=符号两边不能有空格
使用变量:
$variable_name
${variable_name} -->{}可选的,推荐的
单引号’’ 与双引号""区别:
单引号:里面的内容原样输出
双引号: 先解析里面的变量和命令,在输出
将命令的结果赋值给变量(两种方式):
variable=command
variable=$(command)
只读变量:
readonly -->使用readonly修饰的变量不可以修改
name=“lifeng”
readonly name
删除变量:
unset variable_name
7.shell变量的作用域(Scope)
Shell 变量的作用域可以分为三种:
有的变量可以在当前 Shell 会话中使用,这叫做全局变量(global variable);
有的变量只能在函数内部使用,这叫做局部变量(local variable);
而有的变量还可以在其它 Shell 中使用,这叫做环境变量(environment variable)。
全局变量:
所谓全局变量,就是在整个shell会话中都有效。每个shell会话都有自己的作用域,彼此互不影响。在shell中默认是全局变量
局部变量:
定义在自定义函数内的变量,在函数外部也能访问到,若想要变量作用于仅仅在函数内部,只需要在变量前加local
function func(){
local a=99
}
环境变量:
全局变量只在当前 Shell 会话中有效,如果使用export命令将它导出,那么它就在所有的子 Shell 中也有效了,这称为“环境变量”
#定义一个全局变量a
a=22
echo $a
#进入子shell
bash
echo $a -->输出a失败
exit -->退出子shell
export a -->导出a,使得a为环境变量
#再一次进入子shell
bash
echo $a -->输出22
8.shell位置参数(命令行参数)
运行 Shell 脚本文件时我们可以给它传递一些参数,这些参数在脚本文件内部可以使用$n的形式来接收
给脚本文件传递位置参数
#!bin/bash
echo $1
echo $2
./test.sh a b
给函数传递位置参数
function sayHello() {
echo “hello, $1”
}
sayHello lifeng
9.特殊变量
$0 :当前脚本名称
$n :传递给脚本或函数的参数,n表示第几个参数
$# :传递给脚本或函数的参数个数
$* :传递给脚本或函数的所有参数
@ : 传 递 给 脚 本 或 函 数 的 所 有 参 数 。 当 被 双 引 号 " " 包 含 时 , @ :传递给脚本或函数的所有参数。当被双引号" "包含时, @:传递给脚本或函数的所有参数。当被双引号""包含时,@ 与 $* 稍有不同, $*会将所有参数整体上看做一份数据, $@而是把每个参数看做一份数据
$? :上个命令的退出状态,或者函数的返回值
$$ :当前shell进程ID
10.shell命令替换:将命名的输出结果赋值给变量
两种方式命令替换:
`` :反引号
$()
例子:
date1=date
date2=$(date)
echo $date1
echo $date2
LSL=ls -l
echo KaTeX parse error: Expected 'EOF', got '#' at position 6: LSL #̲不使用双引号包围,若命令输出的…LSL" #使用引号包围
要注意的是,$() 仅在 Bash Shell 中有效,而反引号可在多种 Shell 中使用
11.shell字符串详解
字符串可以由单引号’ '包围,也可以由双引号" "包围,也可以不用引号
下面我们说一下三种形式的区别:
由单引号’ '包围的字符串:
任何字符都会原样输出,在其中使用变量是无效的。
字符串中不能出现单引号,即使对单引号进行转义也不行。
由双引号" "包围的字符串:
如果其中包含了某个变量,那么该变量会被解析(得到该变量的值),而不是原样输出。
字符串中可以出现双引号,只要它被转义了就行。
不被引号包围的字符串
不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。
字符串中不能出现空格,否则空格后边的会作为其他变量或者字符串解析。
获取字符串长度:
${#string_name}
12.shell字符串拼接与截取
在shell中只需要将两个字符串并排放在一起就能实现拼接
name=“lifeng”
age=“20”
echo n a m e name nameage
Shell 截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取
从字符串左边开始计数
${string: start :length}
从右边开始计数
${string: 0-start :length}
从指定字符(子字符串)开始截取
使用 # 号截取右边字符
${string#*chars}
使用 % 截取左边字符
${string%chars*}
13.shell数组
bash shell只支持一维数组,不支持多维数组
在shell中,用()表示数组,数组元素之间用空格分隔
arr_name=(a b c d e)
数组中元素类型可以不相同
获取数组中的元素:
获取数组中下标为index的元素
${arr_name[index]}
获取数组中所有元素:
${arr_name[@]}
${arr_name[*]}
使用#获取数组长度
${#arr_name[*]}
${#arr_name[@]}
数组拼接合并:
arr_new=(${arr1[@]} ${arr2[*]})
删除数组元素
unset arr_new[1]
14.shell内建命令
所谓 Shell 内建命令,就是由 Bash 自身提供的命令,而不是文件系统中的某个可执行文件。
使用type测试一个命令是否是内建命令:
[root@1fce913333e2 ~]# type cd
cd is a shell builtin
[root@1fce913333e2 ~]# type ifconfig
ifconfig is /sbin/ifconfig
15.Shell alias:给命令创建别名
16.Shell echo命令:输出字符串
17.Shell exit命令:退出Shell
18.Shell ulimit命令:显示并设置进程资源限度
以下启动方式:
. ./a.sh
source a.sh
相当于在命令行输入命令,结束后会到相应目录下
给a.sh赋可执行权限
./a.sh 相当于重新开一个进程,不会影响当前命令行
举个例子
a.sh脚本内容如下:
cd /opt/tomcat/bin
./startup.sh
如果使用
source a.sh
或
. ./a.sh
方式启动脚本,脚本结束后,命令行会切换到/opt/tocmat/bin目录下