Shell初体验
前言:
Shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操纵系统内核.
Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性强.
一 Shell解析器
1.Linux提供的Shell解析器有:cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/bin/dash
/bin/tcsh
/bin/csh
2.sh和bash的关系
3.Centos默认的解析器是:
二 Shell脚本基本操作
1.脚本格式以 #!/bin/bash 开头(指定解析器)
2.给脚本赋予+x权限 : chmod 777 myshell.sh
自定义变量
1.基本语法
(1)定义变量:变量=值
(2)撤销变量:unset 变量
(3)声明静态变量:readonly变量,注意:不能unset
2.变量定义规则
(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写。
(2)等号两侧不能有空格
(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算。
(4)变量的值如果有空格,需要使用双引号或单引号括起来。
特殊变量
1.基本语法:$# (功能描述:获取所有输入参数个数,常用于循环).
案例:
vi parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
测试结果:
2. $* $@
$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)
$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)
案例:
vi parameter.sh
#!/bin/bash
echo "$0 $1 $2"
echo $#
echo $@
echo $*
测试结果:
3. $?
基本语法
$? (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)
测试结果:
三 运算符
1.基本语法
(1)“$((运算式))”或“$[运算式]”
(2)expr + , - , \*, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
2.案例实操:
(1)计算3+2的值
[root]$ expr 2 + 3
5
(2)计算3-2的值
[root]$ expr 3 - 2
1
(3)计算(2+3)X4的值
(a)expr一步完成计算
[root]$ expr `expr 2 + 3` \* 4
20
(b)采用$[运算式]方式
[root]# S=$[(2+3)*4]
[root]# echo $S
四 条件判断
1.基本语法
[ condition ](注意condition前后要有空格)
注意:条件非空即为true,[ atguigu ]返回true,[] 返回false。
2. 常用判断条件
(1)两个整数之间比较
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)
(2)按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)
(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)
案例实操
(1)23是否大于等于22
[root]$ [ 23 -ge 22 ]
[root]$ echo $?
0
(2)helloworld.sh是否具有写权限
[root]$ [ -w parameter.sh ]
[root]$ echo $?
0
(3)/home/root/cls.txt目录中的文件是否存在
[root]$ [ -e /home/root/cls.txt ]
[root]$ echo $?
1
(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
[root]$ [ condition ] && echo OK || echo notok
OK
[root]$ [ condition ] && [ ] || echo notok
not ok
五 流程控制
if 判断
1.基本语法
if [ 条件判断式 ]
then
程序
elif[条件判断式]
then
程序
fi
或者
if [ 条件判断式 ];then
程序
elif [条件判断式]; then
程序
fi
注意事项:
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格
测试案例:
vi myif.sh
#!/bin/bash if [ $1 == "1" ] then echo "您输入的是1" elif [ $1 == "2" ] then echo "您输入的是2" fi
六 case语句
1.基本语法
case $变量名 in
"值1")
如果变量的值等于值1,则执行程序1
;;
"值2")
如果变量的值等于值2,则执行程序2
;;
…省略其他分支…
*)
如果变量的值都不是以上的值,则执行此程序
;;
esac
注意事项:
1) case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。
2) 双分号“;;”表示命令序列结束,相当于java中的break。
最后的“*)”表示默认模式,相当于java中的default。
测试:
vi mycase.sh
#!/bin/bash case $1 in "1") echo "您输入的是1" ;; "2") echo "您输入的是2" ;; "3") echo "您输入的是3" ;; *) echo "您输入的是任意值" ;; esac
结果:
七 for循环
1.基本语法1
for (( 初始值;循环控制条件;变量变化 ))
do
程序
done
测试案例:
vi myfor.sh
#!/bin/bash s=0 for ((i=0;i<=100;i++)) do s=$[$s+$i] done echo $s
2.基本语法2
for 变量 in 值1 值2 值3…
do
程序
done
测试案例:打印所有输入参数
#!/bin/bash #打印数字 for i in $* do echo "China have beautiful citys like $i" done
3.比较$* 和 $@ 的区别
(a)$*和$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数。
vi test1.sh #!/bin/bash for i in $* do echo "today is $i " done for j in $@ do echo "today is $j" done
输出:
[root]$ sh test1.sh cls xz bd
today is cls
today is xz
today is bd
today is cls
today is xz
today is bd
(b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数。
vi test2.sh #!/bin/bash for i in "$*" #$*中的所有参数看成是一个整体,所以这个for循环只会循环一次 do echo "tomorrow is $i" done for j in "$@" #$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 do echo "tomorrow is $j" done
输出:
[root]$ sh test2.sh cls xz bd
tomorrow is cls xz bd
tomorrow is cls
tomorrow is xz
tomorrow is bd
八 while循环
1.基本语法
while [ 条件判断式 ]
do
程序
done
测试:
vi mywhile.sh #!/bin/bash s=0 i=1 while [ $i -le 100 ] do s=$[$s+$i] i=$[$i+1] done echo $s
输出:
[root]$ ./mywhile.sh
5050
九 read读取控制台输入
1.基本语法
read(选项)(参数)
选项:
-p:指定读取值时的提示符;
-t:指定读取值时等待的时间(秒)。
参数
变量:指定读取值的变量名
案例:(提示7秒内,读取控制台输入的名称)
vi myread.sh #!/bin/bash read -t 7 -p "Enter your name in 7 seconds " NAME echo $NAME
十 函数
1.系统函数 basename基本语法
basename[string / pathname][suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个("\")字符,然后将字符串显出来).
选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉.
测试:(截取/opt/module/test.txt路径的文件名称)
2.dirname基本语法
dirname绝对路径(功能描述:从给定的包含绝对路径的文件名中除去文件名(非目录部分),然后返回剩下的路径(目录部分)).
测试:
3.自定义函数
1.基本语法
[ function ] funname[()]
{
Action;
[return int;]
}
funname
2.经验技巧
(1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。
(2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)
案例:(计算两个输入参数的和)
vi myfunc.sh #!/bin/bash function sum() { s=0 s=$[ $1 + $2 ] echo "$s" } read -p "Please input the first number: " n1; read -p "Please input the second number: " n2; sum $n1 $n2;
输出:
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话