shell入门

本文详细介绍了Linux系统中如何通过shell命令操作硬件如CPU、内存和磁盘,以及如何编写和执行shell脚本。内容涵盖了shell变量、环境变量的管理,包括局部变量、全局变量和常量,还涉及到了流程控制语句、文件操作以及一些实用的文本处理工具如cut、sed和awk。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

linux如何操作硬件cpu,内存,磁盘还有显示器?
内核操作计算机硬件
shell通过编写shell命令发送给linux去执行,操作计算机硬件,shell操作计算机硬件的桥梁
shell是命令

是程序设计语言
shell里面含有变量,函数,逻辑控制语句。。。
shell脚本:通过shell命令或者程序编程语言编写的shell文本文件,就是shell脚本,也叫shell程序
shell解析器
/bin/sh 最原始的
/bin/bash 默认 灵活强大的编辑接口,用户界面友好,交互性强
/bin/nologin 邮件服务
/bin/dash 
/bin/csh C Shell
/bin/tcsh C Shell的扩展脚本

编写格式与执行方式
后缀名规范 建议使用 .sh结尾
首行需要设置shell解析器的类型 
#!/bin/bash 指明当前shell脚本文件采用bash解析器运行脚本代码
注释格式
单行#
多行:<< !

!
脚本文件执行的3种方式
1.sh解析器执行方式
sh 脚本文件
2.bash解析器执行方式
bash 脚本文件
3.仅路径执行方式
./脚本文件 需要脚本文件自己执行 需要有执行权限
区别
12是利用sh\bash执行脚本方式直接使用shell解析器运行脚本文件,不需要执行权限
3需要可执行权限
多命令处理

 变量
用于管理存储临时的数据,都是在运行内存中的
变量类型

1.系统环境变量
shell配置分类
分类1>全局配置文件
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc
2>个人配置文件
当前用户/.bash_profile
当前用户/.bashrc
一般是直接对全局配置进行操作
系统环境分类
1>系统级环境变量(全局共享)
shell环境加载全局配置文件中的变量共享给所有用户所有程序使用
2>用户级环境变量(登录用户)
shell环境加载个人配置文件中的变量共享给当前用户的shell程序使用 
查看当前系统级环境变量+用户级环境变量env
查看shell变量(系统环境变量+自定义+函数)set
常用的系统环境变量
PATH:设置命令的所送偶路径 ,:分割 
HISFILE:显示当前用户执行命令的历史列表文件
LANG:
2.shell自定义变量
定义在一个脚本文件的变量,只能在这个文件使用的变量

1)自定义局部变量
定义语法:
var_name =value
查询语法:
直接使用变量名查询
$var_name 
${var_name }
区别:{}适合拼接字符串
删除unset  var_name 
变量定义规则
1.字母,数字,下划线,不能以数字开头
2.等号两侧不能有空格
3.在bash中,默认字符串类型,无法直接进行数值运算
4.变量的值如果有空格 必须使用“”括起来
5.不能使用关键字
2)自定义常量
自定义常量:不可以修改,只读
语法:readonly var_name 
3)自定义全局变量
父子shell环境介绍
2个脚本文件A.sh B.sh
在A.sh中执行了B.sh脚本文件,那么A.sh就是父shell环境;
B.sh就是shell环境

在当前脚本文件中定义全局变量,这个全局变量可以在当前shell环境与子环境中都可以使用
自定义全局变量语法
export var_name1  var_name2 =value
3.特殊符号变量
$n:用于接收脚本文件执行时传入的参数
$0:获取当前脚本文件名称的
$1-$9代表获取第一个输入--第九个输入参数
第10个以上的输入参数:${数字}
执行脚本文件传入参数语法
sh 脚本文件 输入参数1 输入参数2
$#:输入输出参数的个数
$*
$@
都是获取所有输入参数,用于以后输出所有参数
区别 不使用双引号功能一样 获取所有输入参数
格式为 $1 $2 ....$n 
使用“” :
“$*”获取的所有参数时拼接为一个字符串
格式为“$1 $2 $3 $4 $5 $6 $7 $8”
"$@":获取一组参数列表对象,格式为:“$1” "$2" "$3"
循环打印所有输入参数可以看出区别
循环语法
for var in 列表变量
do  #循环开始
  命令 #循环体
done #循环结束 

$?
用于获取上一个shell命令的状态码,或者是函数的返回值
每个shell命令都有一个返回值,用于说明执行是否成功
一般来说返回0代表执行成功,非0代表失败
$$
用于获取当前shell环境的进程id号
自定义系统环境变量
全局配置文件/etc/profile
当用户进入Shell环境初始化的时候会加载全局配置文件/etc/profile里面得环境变量,供给所有shell程序使用
在etc/profile定义存储自定义系统及得环境变量数据(1.编辑文件)
2.重载配置文件/etc/profile
3.读取系统级环境变量
加载流程原理
交互shell/非交互式shell
工作环境:用户进入linux系统就会初始化shell环境,会加载全局配置文件和用户个人配置文件中环境变量,每个脚本文件都有自己得shell环境
source  /etc/profile
*交互shell
与用户进行交互,互动,效果就是用户输入一个命令,shell环境立刻反馈响应
 *非交互shell
不需要用户参与就可以直接执行多个命令,比如脚本文件含有多个命令
登录shell 非登录shell环境
*shell登录环境:需要用户名密码登录的就是shell环境
*shell非登录环境:不需要用户名密码登录的就是shell环境或执行非脚本文件
切换shell环境执行脚本文件介绍 可以指定具体环境进行执行脚本文件
shell登录环境执行脚本文件语法
sh/bash -l /--login
bash #加载shell非登录环境流程初始化环境变量,执行脚本文件

1.清理 --删除重载

sh/bash 脚本文件
识别登录与非登录环境语法
echo $0
-bash shell登录环境
bash shell非登录环境
登录shell环境
直接登录系统
su 切换用户登录
su 用户名 -l #登录环境变量
su 用户名 #非登录环境变量
增加命令定义变量
shell字符串变量 
1.‘’原样输出,在拼接字符串中使用字符串无效
2.“”可以解析得到的值 还可以包含子双引号
3.不用引号 不能用空格
获取字符串长度
${#name}

字符串拼接
1无符号拼接
2.双引号拼接 万能
3.混合拼接
字符串截取
*${变量名:start :length}:左边第start个开始查找,往右输出length个
*${变量名:0-start :length}: 右边第start个开始查找,往右输出length个
${变量名#*e}截取左边第一个出现e的字符,输出右边的字符
${变量名##*e}截取左边最后一个出现e的字符,输出右边的字符
${变量名%e*}截取右边第一个出现e的字符, 输出左边的字符
${变量名%%e*}截取右边最后一个出现e的字符,输出左边的字符
shell索引数组:定义,获取,拼接,删除
shell只支持一维数组,不支持多维数组
语法:
array_name=(item1 item2)
array_name=([索引下标1]=item1 [索引下标2]=item2)
获取
${arr[index]}
赋值 item=${arr[index]}
@*获取所有元素
${arr[@]}
${arr[*]}
获取数组长度
${arr[@]}
${arr[*]}
获取字符串指定元素长度
${#arr[index]}
数组拼接
arr=(${arr1[@]} ${arr2[@]})
arr=(${arr1[*]} ${arr2[*]})
删除指定元素
unset arr[index]
删除整个
unset arr

内置命令
由shell自身提供的命令,而不是文件系统可执行的脚本文件
判断是否是内置命令
type 命令
内置命令比外置命令执行快

外部命令会引发磁盘i/o 还需要fork单独的进程 执行完再退出 内置命令相当于调用shell进程的一个函数,还是在当前shell 环境进程中,减少上下文切换
alias给命令创建别名 
alias 别名=”命令“
删除别名
unalias 别名   

-a 所有别名
echo 内置命令
默认换行 加-e 不换行
转义字符
\n换行字符
\c清除echo结尾的换行符
echo -e 含有转义字符的数据
read 读取控制台读入
read [选项] [变量]

echo $REPLY //read保存最后一个读入命令的数据 (没有名字就写这个)
-n  num读取num个字符
-p prompt 提示信息 prompt
-s 静默模式 
-t seconds 设置超时时间
读取一个字符
exit 退出 并且可任意返回一个状态码
使用$?获取退出状态码
declare设置变量属性:declare  [+/-][aArxif][变量名称=设置值]
+-取消/指定变量属性
a array ,普通索引数组
A Array 设置为key-value关联数组
r 只读readonly
x  export 设置变量为全局变量
i int
f 函数
查看shell全部变量与函数
declare 
declare -f 函数定义
declare -F 名称列表
实现关联数组变量
键值对(key-value)数组,键就是数组的下标,值也就是元素值
declare -A 关联数组变量名=([字符串key1]=值1   [字符串key2]=值2)

运算符
算术运算符
expr求值表达式 实现整数计算 结合选项对字符串进行处理
expr 算术运算符表达式
获取计算结果赋值给新变量语法
result=` expr 算术运算符表达式`(=左边没有空格 不能进行小数运算) 乘法需要转义 \* 中间要有空格  除号 /
计算字符串长度
expr length 字符串
截取字符串语法
expr substr 字符串 start end 
且包含这个位置的截取
expr index 被查找字符  查找元素
正则表达式匹配1 语法
正则表达式默认以^开头
expr match 字符串 正则表达式
expr 字符串 :正则表达式
返回值为匹配值的长度 否则返回0

比较运算符
整数比较
-eq 相等返回0 不等返回1 [ $a -eq $b ]
-ne not equal 不相等返回true
-gt greater than  >
-lt   lower than  <
-ge greate equal  >=
-le   lower equal <=
<   (($a<$b))
<=
>
>=
==
!=
字符串比较[[]] []
可以比较2个变量, 数字或者字符串
== 或者 =    [ $a == $b ]    [[ $a = $b ]]
!= < > ([]需要转义 【【】】不需要转义)
-z 字符串长度是否为0 
-n   字符串长度是否不为0  [-n  "$a"]
$ 字符串是否不为空
[[]] []区别
不推荐(()) 只包含整数
1.单词分隔的发生 
【【】】不会导致
【】会导致
2转义字符
【【】】不需要
【】需要  [ a \> b ]
推荐[[]] 可以实现数字和字符比较 不需要转义 不会发生单词分割 没有直接的>= ,<=
布尔运算符
!取反 -o 或 -a与
逻辑运算符 
&&  【【】】 (())
||   【【】】 (()) 
!  【【】】[]
布尔运算符 vs 逻辑运算符
1. ! -o -a    【】 、test命令执行
2. ! || && 
文件测试运算符
linux文件类型
-普通文件
d目录文件
l 链接文件
b 块设备文件   硬盘/dev/sda
c字符设备文件   /dev/usb
b c 都是对应计算机硬件的,不同设备文件代表不同的传输数据方式
p管道文件 
-b file  [ -b $file ]
-c file
*-d file
*-f file 普通文件
*-r file 可读文件
*-w file 可写文件
*-x file  可执行文件
*-s file size 文件是否为空
*-e file exists 文件是否存在
file1 -nt file2  new than 1是否比2新
file1 -ot  file2    1是否比2旧
-S  判断是否是socket文件

执行运算命令
expr
(())命令 :整数
((表达式))
((a=1+6))
((b=a-1))
((c=a+b))不需要$
a=$((1+6))
b=$((a+1))
c=((a>7&&b==c))
echo $((a+7))
((a=3+5,b=a+5))
括号有无空格都可以
括号内赋值
((变量名=整数表达式))
括号外赋值
变量名=$(())
多表达式赋值:((变量名1=整数表达式1,变量名2=整数表达式))
let 命令
整数的数学运算
let只能赋值计算不能直接输出
let 赋值表达式 用于整数赋值最简洁 let a=1+6 
多表达式 空格就行  let a=1+6  b=a+5
$[] 整数运算
小结
expr 优点:直接输出 缺点:需要转义,需要$  只能计算一个
(()) 优点:直接输出,不需要转义, 不需要$ 可以多个表达式赋值
缺点:需要获取值以后才能输出
let 优点:赋值简单 特殊字符不需要转义
缺点:不能直接输出
$[] 优点:特殊字符不需要转义
缺点:不能多表达式计算

bc linux简单的计算器 能进行进制转换与计算
bc options 参数
scale 指定精度
ibase  输入进制
obase 输出进制 默认10进制
last 或. 获取最近打印结果的数字
内置数学函数 需要用-l 使用标准库
s(x) 求x的正弦值
c(x) 求x的余弦值
a(X) 求x的反正切
l(x)计算x的自然对数
e(x) 求e的x次方
j(n,x) 贝塞尔函数 求n到x的阶数
不能指定输入是2进制,直接输出是10进制的
借助管道实现非互动的bc计算器
echo "expression "| bc [选项参数]
expression 必须符合bc命令要求的公式
可以引用shell变量
echo "b=$a+2;b"|bc
将bc计算结果赋值给shell变量
var=`echo "expression"|bc`
var=$(echo "expression"|bc)
功能一样,都是执行里面的命令
区别
``:所有linux支持的方式 兼容性好,容易与’‘混淆
$():兼容性差,不容易产生混淆
-q 不显示欢迎信息
非交互式的输入重定向运算
var=`bc<<EOF
第一行表达式
第二行表达式
……
EOF

`
var=$(bc<<EOF
第一行表达式
第二行表达式
……
EOF
)

流程控制语句
流程控制
if 条件
then 
     命令
fi

一行
if 条件;then 命令;fi
if else语句
if 条件
then 
      命令
else
     命令
fi

if elif else语法
if 条件1
then 
    命令1
elif  条件2
then 
    命令2
elif 条件3
then 
    命令3
………
else  条件N

fi

if条件判断句的退出状态
linux任何命令的执行都有一个退出状态,无论内置还是外部文件 还是自定义的shell函数 当他退出时都会返回一个较小的整数给调用他的程序,这就是命令的退出状态
一般0--成功 非0-失败
特殊diff 没有差别-0 差别-1 无效-2
$?
逻辑运算符根据条件状码
内置命令test
对整数进行比较测试
理解test命令对字符串
能够使用test命令对文件测试 
功能与【】一样
if test 数字1 options 数字2
then 
……
fi
options :-eq -ne -gt -ge -lt -le
字符串比较测试
= / ==
!=
\<
\>
-z 字符串  为0则为真
-n 字符串 长度不为0则为真
文件比较 
-e  -r - w -x -s string 文件存在且至少有一个字符则为真 -d 目录
case语句
case 值 in
匹配模式1)
   命令1
   ...
   ;;
匹配模式2)正则表达式* 【abc】[m-n]任意一个字符 |多重选择
  命令1
 ..
 
    ;;
esac

while语句
while 条件
do
      命令1
      命令2
      ……
      continue;
      break;
done
一行语句
while 条件; do 命令; done;

无限循环
while :
do 
    command
done
//
while true
do 
    command
done

until语句
until 条件
do 
    命令
done

循环条件为false会一致循环 ,条件为true停止循环
for循环
多行写法1
for var in item1 item2 ....itemN
do 
    命令1
    命令2
done

一行写法
for var in item1...itemN;do 命令1;命令2...;done;
多行写法2
for var in {start ..end}
do
    命令
done(start end必须为整数)

多行写法3
for((i=start;i<=end;i++))
do 
    命令
done

for((i=start;i<=end;i++));do 命令;done
无限循环
for((;;)); do 命令;done

select 语句 无限循环 输入 ,输入的值无效都不会结束菜单 只有break /ctrl +D结束
交互性
select var in menu1 menu2..
do 
     命令
done

系统函数
basename 获取文件名的函数
basename [string /pathname] [后缀名]
basename test1.sh ->test1.sh
basename test1.sh .sh ->test1 去掉后缀名
dirname 从指定的文件绝对路径 去掉文件名 ,返回剩下的前缀目录路径
dirname 绝对路径
shell的自定义函数
可有可无返回值函数
代码重用
[ funtion ] funname() 
{
    命令
   [return 返回值]
}#定义
funname 传递参数1 传递参数2 #调用
参数返回 可以显示加return 
不加,将以最后一条命令运行 作为返回值 return后跟(0-255)
无参无返回值
有参函数
$# 传递到脚本或函数的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程id号
$! 后台运行的最后一个进程的id号
$@ 以一个单字符串显示所有向脚本传递的参数 但是使用时加引号,并在引号中返回每个参数
$?  最近一个命令的退出状态
****shell函数和函数的区别
shell程序(外部脚本,内部文件)在子shell中运行
shell函数在当前shell的进程中运行 
输出重定向 默认从程序流向显示器 改变了方向 数据就流向其他地方 
输入重定向 默认从键盘流向程序 改变了方向 数据就从其他地方流入
默认输入输出文件 临时 

stdin 标准输入 文件描述符0
stdout标准输出  文件描述符1
stderr 标准错误输出  文件描述符2
命令> file 输出覆盖
命令 >> file 追加输出
命令<< file读取文件数据
命令<file1>file2 从file1中读取数据 输出到file2中
命令 fd> file
命令 fd>> file
命令> file fd1>& fd2  fd1 fd2文件描述合并 输出到文件
fd1<& fd2 fd1 fd2文件描述合并  从文件读取输入
<< tag 
shell好用的工具cut sed awk sort 
文本处理工具
cut切割提取列 字符 字节的数据
cut [options] filename
-f 列号
-d 自定义分隔符
-c 提取范围 以字符为单位
-b 提取范围 忽略多字节字符边界  
-n  与-b 一起用 不分割多字节字符
提取范围说明
n- 提取第n列或者字符或字节后面所有数据
n-m n-m列的所有
-m 指定第m列前面所有
n1,n2 枚举的所有数据
sed提取行  流编辑器 非交互式文本编辑器 实现增删改查等操作 支持按行字段正则匹配文本内容 灵活方便
使用sed编辑文件替换文件中的单词
编写在文件中插入或者修改行的sed程序
使用sed作为过滤器来过滤管道数据命令
每一行->sed 模式空间 判断是否符合
sed [option] [模式匹配/sed程序命令] [文件名]
-e 直接在指令列模式上进行sed动作编辑 
-i 直接对内容进行修改 不加i默认预览 
-f 保存了sed指令的文件(保存到其他文件)
-n 取消默认输出
-r  正则表达式
*****sed程序命令
a add
sed '3ahello' sed.txt#指定行号后面添加数据 
c change
d delete
i insert
sed '3ihello' sed.txt#指定行号前面添加
p print
s substitute
= 用来打印被匹配的行的行号
n 读取下一行 遇到n自动跳入下一行
特殊符号
! 取反
{sed命令1;sed命令2}
添加
指定行号前后加数据
sed '3ahello' sed.txt
sed '3ihello ' sed.txt
指定内容前后加数据
sed  '/itheima/ahello' sed.txt
sed '/itheima/ihello' sed.txt
在最后一行前后加hello
sed  '$ahello ' sed.txt
sed '$ihello' sed.txt
删除
删除第二行
sed '2d' sed.txt
删除奇数行
sed '1~2d' sed.txt
删除指定范围的多行数据
sed '1,3d' sed.txt#1-3行删除
删除指定范围取反的多行数据
sed '1,3!d' sed.txt
删除最后一行
sed '$d' sed.txt
删除匹配itheima的行
sed '/itheima/d' sed.txt
删除匹配行到最后一行
sed '/itheima/,$d' sed.txt
删除匹配行及后面一行
sed '/itheima/,+1d' sed.txt
删除不匹配的行
sed '/itheima/!d' sed.txt
更改
文件第一行修改为hello
sed '1chello' sed.txt
将包含itheima的行修改为hello
sed '/itheima/chello' sed.txt
将最后一行修改为hello
sed '$chello' sed.txt
将文件的itheima替换为hello
sed 's/itheima/hello/' sed.txt 每行的第一个替换
sed 's/itheima/hello/g' sed.txt 每行都替换
sed 's/itheima/hello/2' sed.txt 每行的第二个替换
替换后将内容写入文件
sed  -n 's/itheima/hello/pw sed2.txt' sed.txt
正则表达式匹配
匹配有i的行 ,替换匹配行中t后的所有内容为空
sed '/i/s/t.*//' sed.txt
每行末尾拼接一个test
sed 's/$/& test/' sed.txt
每行行首添加一个#
sed ‘s/^/&/#/’ sed.txt
查询
查询含有itcast的行数据
sed -n '/itcast/p' sed.txt
 管道过滤查询
ps -aux | sed  -n '/sshd/p'
执行多个命令
sed '1d;s/itheima/itcast/g' sed.txt
sed -e '1d' -e 's/itheima/itcast/g' sed.txt
sed高级用法:缓存区数据交换
sed处理文件是读取一行输出一行 在模式空间
暂存空间刚开始只有一个空行
h 模式空间内容复制到暂存空间覆盖
H  模式空间内容复制到暂存空间追加
g暂存复制到模式覆盖
G暂存复制到模式 追加
x交换2个空间的内容
缓存空间数据交换
第一行粘贴到最后一行
sed '1h;$G' sed.txt
第一行删除粘贴到最后一行
sed  '1{h;d} ;$G'   sed.txt
将第一行复制粘贴替换其他行的数据
 sed '1h;2,$g' sed.txt
将前三行数据复制粘贴到最后一行
sed '1,3H;$G' sed.txt
给每行添加空行
sed 'G' sed.txt
删除空行
sed  -i '/^$/d' sed.txt

awk强大的文本分析工具
把文件逐行的读入 以空格为默认分隔符将每行切片 再进行各种分析处理 因为切开的部分使用awk可以定义变量,运算符,使用流程控制语句进行加工与分析
awk [options] 'pattern{action}' {filenames}
action 找到匹配内容时所执行的一系列命令
pattern :表示awk在数据中查找的内容 ,就是匹配模式
-F 指定输入文件拆分分隔符
-v 赋值一个用户定义变量
内置变量
ARGC 命令行参数个数
ARGV 命令行参数排列
NF 浏览记录的域的个数,根据分隔符分割后的列数
NR 已读的记录数,也是行号
$n $0变量是值整条记录,$1表示当前行的第一个域
$NF 最后一列的信息
默认每行空格切割
 echo "123 456 678"|awk '{print $1"&"$2"&"$3}'
打印含有匹配行的列
awk '/root/{print $0 }' passwd
获取打印第七列的信息
awk  -F ":" '/root/{print $7}' passwd
打印第二行
awk  -F ":" 'NR==2{printf("")}\n' passwd
c开头的
 awk '/^c/{print}' passwd
打印第一列
 awk  -F ":" '{print $1}' passwd
打印最后一列
 awk  -F ":" '{print $NF}' passwd
打印倒数第二列
 awk  -F ":" '{print $(NF-1)}' passwd
打印10-20的第一列
awk -F ":" '{if(NR>=10&&NR<=20)print $1}' passwd
多分隔符使用
echo "123,456:789" |awk -F "[,:]" '{print $1"&"$2"&"$3}' 

添加开始与结束内容
 echo -e "abc\nabc" |awk 'BEGIN{print"开始。。。"}{print $0}END{print "结束。"}'
使用循环拼接分割后的字符串
echo "abc   itheima itcast "|awk -v str="" '{for(n=1;n<=NF;n++){str=str$n}} END{print str}‘
操作指定数字运算
echo "2.1" |awk -v i=1 '{print $0+i}'
切割ip
ifconfig|awk '/broadcast/{print $0}'|awk  '{print $2}'
显示空行行号
 sed  G sed.txt|awk '/^$/{print NR}'

grep 
-v 取反
-E 支持正则表达式
-i 忽略大小写

-n 显示行号

sort 排序
字符串、数字升序降序排序 多列进行排序
sort (options) 参数
-n 数值排序
-r 反序
-t 分隔字符
-k 指定需要排序的列
-o输出文件
对字符串升序或降序
sort -kstart,end 文件
sort -kstartr,end 文件
对数字升序或降序
sort -kstartn,end 文件
sort -kstartnr,end 文件
多列排序
sort -kstart[n,r],end -kstart[n,r],end ...文件 
uniq 去重
-c 统计数量

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值