文章目录
shell
概述:
既是一种应用程序,又是一种程序设计语言
从应用程序角度理解:
交互式地解释、执行用户输入的命令,将用户的操作翻译成机器可以识别的语言,完成相应功能
称为 shell 命令解析器
作用:
shell 是用户 与 Linux 内核之间的 接口程序
用户在提示符下输入的命令[如 cd pwd ls ...]都由 shell 先解释然后传给 Linux 核心它调用了系统核心的大部分功能来执行程序、并以并行的方式协调各个程序的运行
Linux 系统中提供了好几种不同的shell命令解释器,如 sh、ash、bash等。
一般默认使用 bash 作为默认的解释器。
后面编写的shell脚本,都是由上述shell命令解释器解释执行的。
查看默认 shell 命令解释器
shellecho $SHELL
从程序设计语言角度理解:
概念:
它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括
循环和分支
完成类似于windows下批处理操作,简化我们对系统的管理与应用程序的部署称
之为shell脚本
学过的c/c++等语言,属于编译性语言(编写完成后需要使用编译器完成编译、汇编、链接等过程变为二进制代码方可执行)
shell脚本是一种脚本语言 ,我们只需使用任意文本编辑器,按照语法编写相应程
序,增加可执行权限,即可在安装shell命令解释器的环境下执行 增加可执行权限命令:
chmod +x 文件名 注意文件名路径
分类:
-
系统调用
bash这类脚本无需用户调用,系统会在合适的时候调用,如:/etc/profile、 ~/.bashrc 等 /etc/profile: 启动时调用 ~/.bashrc: 用户登录时调用
-
用户编写手动调用
-
示例:控制台打印hello shell 不需要编译器 只要有命令解析器就行
shell代码: #!/bin/bash echo "hello shell" 增加可执行权限 运行
-
语法:
1、#!
定义以开头:#!/bin/bash
#! 用来声明脚本由什么shell 解释,否则使用默认shell
2、#
单个"#"号代表注释当前行
3、执行:
方式1:
bash
./shell 文件名
这种方式先检测执行的文件中是否存在指定的shel命令解析器,如果存在使用指定的,如果不存在 使用默认的
开启子shell 由shell执行
方式2:
bash
shell命令解析器名称 shell文件名
这种方式不会检测文件中是否存在指定的shell命令解析器,使用执行命令前指定的shell解析器
开启子shell 由子shell执行
方式3:
bash
source shell文件名
或
. shell文件名
这种方式不会开启 子(新的)shell,直接由当前的shell去解释执行脚本
注意:
不要在window下使用最好
bash
创建文件时:
如果是在windows中创建编写的shell脚本文件,拖拽到Liunx下无法运行,因为windows与Liunx下\表示的含义不同,所以导致程序无法被识别
解决方案1:
在Liunx中使用vim编辑器,在最后一行模式输入Setff=unix
解决方案2:
在Linux中安装dos2unix,使用dos2unix转换
步骤:
1,命令行输入:sudo apt-age instal1 dos2unix
2,命令行输入:dos2unix文件地址
第一个shell脚本
步骤:
- 1 创建一个文件
- 2 指定解析器
- #!/bin/bash
- 3 编写命令
- linux命令
- 4 保存
- 5 增加权限
- chmod +x 文件名
- 6 执行
变量
作用:临时记录一个值或可以被改变的数据
分类:
- 系统变量
- 使用 env 查看 注意 =号左边为变量名 =右边为变量值
- 自定义变量
变量的定义:
变量的定义与初始化:
- 变量名=值
- 注意:等号两边不能有空格
- 此时所有的值都是字符串
变量的修改
- 变量名=值
- 注意:
- 此时变量已经被定义
- 注意:
变量的取值
- $变量名
撤销变量
- unset 变量名
示例:
文件名 00_shell
bash
#!/bin/bash
data=100 #定义变量
echo $data #取值
unset data #撤销变量
chmod -x 00_shell # 提升权限
./00shell #执行
声明只读变量
- readonly 变量名=值
- 注意:
- 只读变量 不能撤销 不能改值
- 注意:
导出变量:
- export 变量名
- 作用: 导出变量,导出给父 shell
- 1 2 会导给 父shell 3 因为不会开启子shell 所以会导出到系统变量
- 作用: 导出变量,导出给父 shell
declare -i 将变量强制转换为数字
- declare -i 变量名
示例:
bash
#!/bin/bash
declare -i xxz=100
xxz=&xxz*2
echo $xxz #结果 是200
注意:
- 子shell 可以访问父shell的变量
- 父shell 不能访问子shell的变量
预设变量
- $#:传给shell脚本参数的数量
- $*:传给shell脚本参数的内容
- $1、$2、$3、、、、$9:运行脚本时传递给其的参数,用空格隔开
- $?:命令执行后返回的状态
- 用于检查上一个命令执行是否正确(在Linux中,命令退出状态为0表示该命令正确执行,任何非0值表示命令出错)。
- $0:当前执行的进程名
-
:当前进程的进程号 * $$:变量最见的用途是用作临时文件的名字以保证临时文件不会重复
bash
"": 包含的变量会被解释
'':包含的变量会作为字符串处理
``:反引号中的内容作为系统命令,并执行其内容,可以替换输出为一个变量
\: 同c语言\n \t \r \a 等echo命令需加-e转义(bash解析器需求)
echo -e "123\n456" #这样才会换行
(命令):由子she11来完成,不影响当前she11中的变量,命令前后必须有空格
{命令}: 在当前shell中执行,会影响当前变量,命令前后必须有空格
键盘录入
语法
- read 变量名
- read -p 提示内容 变量名
示例:
bash
#!/bin/bash
num=0
# echo "请输入一个数:"
# read num
# 或
read -p "请输入一个数:" num
echo "num=$num"
条件测试语句
语法:
语法1: test 条件
语法2:[ 条件 ] 注意:条件前后必须有空格
文件测试
bash
文件测试:测试文件状态的条件表达式
-e 是否存在
-d 是否为目录
-f 是否为文件
-r 是否可读
-W 是否可写
-x 是否可执行
-L 是否连接
-c 是否字符设备
-b 是否为块设备
-S 是否文件非空
示例:
bash
test -e kkk
echo $? # $? 返回执行状态
返回0 为真 非0 为假
bash
[ -e kkk ]
echo $?
字符串测试
bash
= 两个字符串相等
!= 两个字符串不相等
-Z 空串
-n 非空串
#注意:=! =前后要有空格
数值测试
bash
-eq 数值相等
-ne 数值不相等
-gt 数 1 大于数 2
-ge 数 1 大于等于数 2
-le 数 1 小于等于数 2
-1t 数 1 小于数 2
扩展:
bash
#${num:-Va]}如果num存在,返回num,否则返回va]
echo ${x:-10}
#${num:=Va]}如果hum存在,返回num,否则返回va1,并将va1赋值给num
echo ${y:=10}
echo $y
复合测试:
bash
&&
command1 && command2
&&左边命令(commandl)执行成功(即返回0)shell 才执行&&右边的命令(command2)
||
command1 1l command2
丨左边的命令(command1)未执行成功(即返回非0)shel]才执行丨|右边的命令(command2)
多重条件:
bash
-a:与
-o: 或
!: 非
示例:
bash
#!/bin/bash
#输入文件路径判断文件是否可读可写可执行
echo 请输入文件路径
read filename
[ -r $filename -a -w $filename -a -x $filename ]
echo $filename 是否可读可写可执行:$?
[! -x $filename ]
echo $filename 是否不可执行:$?
if 语句
bash
if [ 条件1 ];then
执行第1段程序
elif [ 条件2 ];then
执行第2段程序
elif[ 条件3 ];then
执行第3段程序
....
else
执行第n段程序
fi
示例:
bash
#!/bin/bash
read -p 请输入年龄 age
elif [ $age -ge 18 ];then
echo 成年人
else
echo 未成年
fi
case语句
bash
case $变量名 in
"值1")
语句1
;;
"值2")
语句2
;;
"值2")
语句3
;;
esac
扩展 exit 1 #退出shell
示例
for语句
bash
for((初始值;限制值;执行步阶))
do
程序段
done
示例:
bash
#!/bin/bash
#计算100以内数之和
#declare-is强制将s作为int型数值,需要使用./运行
declare -i s=0
declare -i sum=0
for(( s=0; s<=100; s++ ))
do
sum=$sum+$s;
done
echo$sum
while语句
bash
while [ 条件 ]
do
执行语句
done
示例:
注意 一定要注意 空格 的问题
bash
#!/bin/bash
declare -i i=0
while [ $i -le 100 ]
do
echo $i
i=$i+1
done
扩展:
bash
#!/bin/bash
# 变量名=$(( 值1 + 值2 ))
n01=10
n02=2
n03=$(( $n01 + $n02 ))
echo $n03
# 变量名=$(( 值1 - 值2 ))
n04=$(( $n01 - $n02 ))
echo $n04
# 变量名=$(( 值1 * 值2 ))
# 变量名=$(( 值1 / 值2 ))
# 变量名=$(( 值1 % 值2 ))
# 变量名=$(( 变量名-- ))
# n05=$(( n01-- ))
# echo $n05
# echo $n01
# 变量名=$(( --变量名 ))
n05=$(( --n01 ))
echo $n05
echo $n01
# 变量名=$(( 变量名++ ))
# 变量名=$(( ++变量名 ))
# 变量名=$(( -10 > 1 ? 10 : 1 ))
n06=$(( -10 > 1 ? 10 : 1 ))
echo $n06
until语句
语法:
bashuntil [ 条件 ] do 程序段 done 注意: 当条件表达式为假执行循环体中的代码,如果为真,结束循环
示例:
bash#!/bin/bash i=0 until [ $i -ge 10 ] do i=$(( ++i )) echo $i done
函数
定义:
bash
语法1
函数名(){
程序段
}
语法2
function 函数名()
{
程序段
}
调用
bash
函数名 参数1 参数2....
示例:
bash
#!/bin/bash
#函数的定义1
#函数名(){
#}
method()
{
echo 自定义函数被执行
}
#函数的调用:函数名 参数1 参数2 ...
method
=
#函数的定义2
#function 函数名(){
#}
function method02()
{
echo 自定义函数2被执行
}
method02
add()
{
num=$(( $1+$2 ))
return $num
}
add 2 21
echo $?