文章目录
- 什么是shell?
- 变量
- 环境变量的设置和显示
- 特殊变量
- 特殊的状态变量
什么是shell?
从技术角度,Shell的最简单定义:命令行解释器(command Interpreter)主要包含:
1, 将使用者的命令翻译给核心(kernel)处理。
2, 同时,将核心的处理结果翻译给使用者
什么是bash呢? shell的一种。
输出打印hello
#! /bin/bash 固定格式, 指定解释器为bash
‘#’ 是注释符
[chen@iZ0jl780lb0oio7v4b0chbZ shell_test]$ cat hello.sh
#! /bin/bash
# 这是第一个shell脚本编程
echo "hello shell"
运行的时候会发现没有权限, 解决方案:
1, 添加可执行权限 chmod u+x hello,sh
2, /usr/bin/bash hello.sh 指定解释器去运行
或者: 直接这样去执行
source hello.sh
. hello.sh
bash hello. sh
bash < hello.sh
他们的区别 : bash/sh会创建一个新的子进程去执行, 而 source 和 点 会在当前进程去执行。
shell脚本语言本质是一种弱语言。 定义变量的时候,不需要提前指定类型
C/C++是强语言, 使用的时候必须给定类型。
查看shell解释器
[chen@iZ0jl780lb0oio7v4b0chbZ shell_test]$ cat /etc/shells
/bin/sh
/bin/bash
/usr/bin/sh
/usr/bin/bash
变量
重提核心终点:bash/sh会创建一个新的子进程去执行命令或者脚本,而source/点会在当前进程
如果说用bash/sh去执行,一般不会保留变量!!!
变量的生命周期都是随shell进程的
直接输出指令 name=“zhangsan” 不能有空格
echo $name 输出变量
变量的作用域:本地变量只针对于当前shell进程,意味着无论是父进程还是子进程,都是看不到的
铺贴: 介绍pstree指令, 显示进程树
环境变量, PATH称为全局变量,当前shell进程和以后的任意子进程
查看环境变量 ehco $PATH
特殊变量:$?
值为0——255 返回上一个进程执行的退出码, 0是成功
单引号和双引号变量的区别
单引号不识别特殊语法, 双引号识别特殊语法
反引号的作用(在键盘的esc下面):会把执行结果给替换
[chen@iZ0jl780lb0oio7v4b0chbZ shell_test]$ name=`ls`
[chen@iZ0jl780lb0oio7v4b0chbZ shell_test]$ echo $name
hello.sh test.sh
shell变量的面试题(白嫖的b站免费课程,所以就懒得换了, 哈哈~~)
结果 : C, 解析 :sh/bash会创建新的子进程去执行,而变量的作用域在当前进程。
环境变量的设置和显示
set,可显示当前shell进程的全局变量和局部变量(包括shell脚本定义的变量)
env,只显示全局变量
declare, 和set一样
export,设置和显示环境变量
readonly 设置只读变量
unset,删除变量或函数
如何过滤出所有的环境变量名呢
export 显示所有的环境变量
通过awk命令
# -F 文本显示 '[ :=]’ 指定分隔符为空格和等号 '{}print $3}' 输出分割后的第三个内容
export | awk -F '[ :=]' '{print $3}'
特殊变量
参数传递
例如
ls -a -l # 参数-a -l传递给了ls
$0 输出脚本文件
$1 第一个参数
$n 第n个参数
$# 获取参数个数
$* 获取所有的参数
$@ 获取所有的参数
[chen@iZ0jl780lb0oio7v4b0chbZ shell_test]$ cat test.sh
echo $0 # 输出脚本文件名
echo $1 # 输出第一个参数
echo $2 # 输出第二个参数
echo $# # 输出参数个数
echo $* # 输出所有参数
echo $@ #输出所有参数
[chen@iZ0jl780lb0oio7v4b0chbZ shell_test]$ bash test.sh chen lang da shuai bi
test.sh
chen
lang
5
chen lang da shuai bi
chen lang da shuai bi
面试题 : >$* 和 $@的区别
都是输出所有的参数
如果两者都是在引号的包围下,
∗
会将整体当成一份,
*会将整体当成一份,
∗会将整体当成一份,@会当成各自独立的一份
用for循环打印测试
[chen@iZ0jl780lb0oio7v4b0chbZ shell_test]$ cat test1.sh
for i in "$*"
do
echo "$i"
done
echo "----------------------------------------"
for i in "$@"
do
echo "$i"
done
[chen@iZ0jl780lb0oio7v4b0chbZ shell_test]$ bash test1.sh chen lang da shuai bi
chen lang da shuai bi
----------------------------------------
chen
lang
da
shuai
bi
特殊的状态变量
$? 上一次命令执行状态的返回值
$$ 当前shell脚本pid
$! 上一次后台进程的pid (nohup)
$_ 上次命令的最后一个参数