shell(学习笔记一)
shell介绍
shell :用户与Linux内核之间的解释器(将用户指令翻译成内核可识别的指令)
应用程序
命令解释器
操作系统内核
计算机硬件
查看系统默认的shell解释器: echo $SHELL
查看系统支持的shell解释器: cat /etc/shells
可以通过usermod、chsh更改不同用户使用的shell解释器(root权限下)
usermod -s /bin/sh username
chsh-s /bin/sh username
grep username /ect/passwd
查看用户所使用的解释器
bash特性
一般默认使用的shell解释器是bash
-
快捷键 (可参考 常用的Linux shell快捷键)
-
命令历史(history)
-
命令别名(alias)
-
标准输入输出重定向(>、>>、2>、2>>、&>)
-
管道(|):组合多条命令如
apt list | grep bash
>: 重定向 `ls > a.txt`没有该文件时创建文件 适用于正确的信息 使用>都会覆盖文件 >>:追加重定向(只追加不覆盖) `ls >> a.txt`该文件必须已存在 2>: 适用于错误信息 &>: 适用于所有正确错误信息
执行shell脚本的方法
shell脚本:提前将可执行的命令语句写入一个文件。
-
作为解释器参数 bash / sh + filename.sh:
bash test.sh
sh test.sh
这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用。 若使用`suorce 脚本名.sh`则不会启动子进程,可通过pstree查看进程树。
下图第一个用bash,第二个用source
-
作为可执行程序 ./filename.sh
需要添加执行权限chmod +x test.sh
然后./test.sh
每个程序都有自己对应的解释器,若用./执行,最好在文件中指明解释器:
1.文件首行添加 #!/bin/bash
2.添加执行权限 chmod +x test.sh
3.然后再 ./test.sh
变量
- 全局变量:在当前shell及子shell中有效,定义全局变量使用
export
- 局部变量:只在当前shell环境中有效
变量类型
- 环境变量(系统)
- 位置变量(bash内置,存储脚本执行时的参数)
- 预定义变量(bash内置,可以调用但是不能赋值或修改)
- 自定义变量(用户定义)
自定义变量
定义变量:变量名=变量值
取消变量:unset 变量名
(脚本执行完会自动回收变量,所以脚本中不需要unset)
注意:变量名和等号之间不能有空格
不能使用关键字
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头
查看变量:$变量名
或 ${变量名}
加花括号是为了帮助解释器识别变量的边界
使用readonly
命令可以将变量定义为只读变量,只读变量的值不能被改变。
环境变量
存储在/etc/profile或~/bash_profile
列出所有环境变量:env
常见环境变量:PATH、PWD、USER、UID、HOME、SHELL
- PATH:搜索命令路径
- PWD:当前路径
- USER:当前用户名
- UID:当前用户ID号
- HOME:家目录
位置变量
存储脚本执行时的参数,即命令行传参,类似于C的argc、argv
使用$n表示,例如$1...${10}...
预定义变量
保存脚本程序的执行信息,可以直接使用但不能赋值
$0:当前所在的进程或脚本名
$$:当前运行进程的PID号
$?:命令执行后的返回状态
$#:已加载位置变量的个数,即传递到脚本的参数个数
$*:所有位置变量的值,即 以一个单字符串显示所有向脚本传递的参数。
$* 与 $@ 区别:
相同点:都是显示所有向脚本传递的参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数)
引号
双引号" ":可以有变量和转义字符
单引号’ ':字符原样输出,变量无效
反引号 :将命令的执行输出作为变量值,$()与反引号等效
字符串
获取字符串的长度
echo ${#str}
提取子字符串
echo ${str:1:4}
查找子字符串
echo `expr index "$x" a`
shell数组
bash支持一维数组(不支持多维数组),不限定数组大小。
array=(1 2 3)
输入${array[0]}
输出1
读取数组:${数组名[下标]}
获取数组中的所有元素:echo ${array[@]}
取得数组元素的个数:echo ${#array[@]}
或 echo ${#array[*]}
获取数组单个元素的长度:echo ${#array[n]}
read标准输入取值
read [-p "提示信息" -t 指定超时秒数 -s(设置是否在终端显示输入的内容)] 变量名
作用:从键盘读取值
基本运算
$[]或$(())或用let命令
支持简写
bash不支持小数运算,可以通过计算器软件bc实现小数运算(scale可指定小数位数),bc也支持比较运算操作
也可用expr进行多种运算
交互式bc运算
非交互式bc运算(管道传递)
expr运算
echo `expr 2 + 2`
表达式和运算符之间要有空格
完整的表达式要被反引号包含
多行注释
:<<EOF
注释内容...
注释内容...
注释内容...
EOF
或(EOF可用其他符号代替’、!)
学习来源:【2021版】Shell脚本从入门到精通以及菜鸟教程
目录跳转
shell(学习笔记二)
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 【译】Visual Studio 中新的强大生产力特性
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· AI与.NET技术实操系列(六):基于图像分类模型对图像进行分类