Shell的正确使用

目录

[shell 介绍](#shell 介绍)

变量名的定义规则

变量名定义:

删除变量

特殊的变量名:

算术运算符

逻辑运算符:

(1)整数之间比较

(2)按照文件权限进行判断

(3)按照文件类型判断

(4)多条件判断

常用的特殊字符:

条件选择、判断

if判断

条件判断:case

循环:

for:

while

until循环:

[select 循环与菜单](#select 循环与菜单)

read读取控制台输入

自定义函数:

练习题:


shell 介绍

Shell 一个命令解释器,它接收应用程序/用户命令,然后调用操作系统内核。

Shell还是一个功能强大的编程语言,易编写、易调试、灵活性强。

Linux提供的Shell解析器有:

Centos 默认的Shell解释器是bash

命令:echo $SHELL

变量名的定义规则

(1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写

(2)等号两侧不能有空格

(3)在bash中,变量默认类型都是字符串类型,无法直接进行数值运算

(4)变量的值如果有空格,需要使用双引号或单引号括起来

变量名定义:

定义变量:username="小明"

查看变量内容:echo $username

删除变量

:unset username

查看全部变量:set

正确定义数组:arr=("熊大" "熊二" "光头强" "蹦蹦")(两个元素之间不能使用逗号,需要使用空格来分割数组中的每个元素)

**根据下表拿数组元素:**echo ${arr[1]}

echo ${arr[2]}

**拿取所有元素:**echo ${arr[*]}

将局部环境变量提升为全局:假如先编写一个demo1.sh文件,里面定义echo $username

通过sh demo1.sh查看为空白内容

然后在外面编写一个username=小丫丫,当我们定义export username时,发现当我们查看sh demo1.sh时,输出小丫丫

这时,就是局部变量提升为全局变量

正确选择引号(单引号和双引号的区别):

定义:dog=金毛 echo $dog 输出结果为:金毛

dog='金毛' echo $dog 输出结果为:金毛

dog="金毛" echo $dog 输出结果为:金毛

定义:

yy='dog 是一只小狗' echo yy 输出结果:$dog 是一只小狗

yy="dog 是一只小狗" echo yy 输出结果:金毛 是一只小狗

避免在命令中使用反引号

在bash中,可以将命令的结果保存到变量中,有两种可能:

file_list=`ls`

或者

file_list=$(ls)

特殊的变量名:

n(功能描述:n为数字,0代表该脚本名称,1-9代表第⼀到第九个参数,⼗以上的参数需要⽤⼤括号包含,如${10})

$# (功能描述:获取所有输⼊参数个数,常⽤于循环)。

\* (功能描述:这个变量代表命令⾏中所有的参数,*把所有的参数看成⼀个整体)

@ (功能描述:这个变量也代表命令⾏中所有的参数,不过@把每个参数区分对待)

$?(功能描述:最后⼀次执⾏的命令的返回状态。如果这个变量的值为0,证明上⼀个命令正 确执⾏;如果这个变量的值为⾮0(具体是哪个数,由命令⾃⼰来决定),则证明上⼀个命令执⾏不正确了。)

算术运算符

(1)"((运算式))"或"[运算式]"

(2)expr + , - , \*, /, % 加,减,乘,除,取余

注意:expr运算符间要有空格

逻辑运算符:

格式:[条件] 注意:[]里面前后必须要有空格

结果:0表示真,非0表示假

(1)整数之间比较

=字符串比较

-lt小于 -le小于等于 -eq等于

-ge大于等于 -gt大于

-ne不等于

(2)按照文件权限进行判断

-r有读的权限(read)

-w有写的权限(write)

-x有执行的权限(execute)

(3)按照文件类型判断

-f 文件存在并且是一个常规文件

-e 文件存在

-d文件存在并是一个目录

(4)多条件判断

(&&表示前一条命令执行成功时,才执行后一条命令,||表示上一条命令执行失败后,才执行下一条命令)

常用的特殊字符:

^

^匹配一行的开头,如下,会匹配/etc/passwd中以root开头的行:

cat /etc/passwd | grep ^root

$匹配一行的结尾,如下,会匹配出/etc/passwd中以bash结尾的行:

cat /etc/passwd | grep bash$

.匹配任意字符:

cat /etc/passwd | grep r..t

*不单独使用,和上一个字符连用,表示匹配上一个字符0次或多次,如下,可匹配第一个字符为r,最后一个字符为t,中间可包含任意数量的o:

cat /etc/passwd |grep ro*t

字符区间(中括号)[]

\]表示匹配某个范围内的一个字符,例如 \[6,8\] 匹配6或8 \[0-9\] 匹配1个0-9的数字 \[0-9\]\* 匹配任意长度的数字字符串 \[a-z\]\* 匹配任意长度的字母字符串 \[a-ce-f\] 匹配a-c或者e-f之间的任意一个字符 特殊字符:\\ \\表示转义,并不会单独使用,当匹配某一特殊字符时,需要将转义字符和特殊字符连用例如:echo "abc$" \| grep "\\\\$" echo "abc$" \| grep '\\$' ![](https://i-blog.csdnimg.cn/direct/f781143d34d74e9899dcde2e3a6e9493.png) 扩展的正则表达式:如{n,m},使用grep匹配的时候,需要添加-E选项,否则无法识别这种语法:echo "ab,cdre" \| grep "\[a-z\] {2,3}" echo "ab,cdre" \| grep -E "\[a-z\] {2,3}" ![](https://i-blog.csdnimg.cn/direct/d4a6d6b0b5654f819f2be1ed572f2288.png) #### 条件选择、判断 ##### if判断 用法格式:if 判断条件 1 ; then 条件为真的分支代码 elif 判断条件 2 ; then 条件为真的分支代码 else 以上条件都为假的分支代码 Fi 例子: ![](https://i-blog.csdnimg.cn/direct/6f61b7260ea544bc850398a82af9f65a.png) ![](https://i-blog.csdnimg.cn/direct/9f03473ac2694a03a9477bbf68d8959b.png) ##### 条件判断:case 用法格式: case $name in PART1) cmd ;; PART2) cmd ;; \*) cmd ;; esac case行尾必须为单词"in" ,每一个模式匹配必须以右括号")"结束。 双分号";;"表示命令序列结束,相当于break 最后的\*)表示默认模式,相当于default ![](https://i-blog.csdnimg.cn/direct/8d479df5e4184033b6f485da07499edf.png) ![](https://i-blog.csdnimg.cn/direct/98c917ca682c4c3993f146f5d1a6b3fe.png) #### 循环: ##### for: ![](https://i-blog.csdnimg.cn/direct/7577b21c09a74644a719d11d673f3620.png) ##### while 用法格式:while 循环控制条件 ;do 循环 done ![](https://i-blog.csdnimg.cn/direct/f361d391d6444753b0ab55398218a7ff.png) ![](https://i-blog.csdnimg.cn/direct/d45cec168de1432f9aa00e53f6e27e16.png) ##### until循环: 用法: until 循环条件 ;do 循环 done 进入条件:循环条件为true;退出条件:循环条件为false;刚好和while相反,所以不常用 ##### select 循环与菜单 用法: select variable in list do 循环命令 done 1、select循环主要用于创建菜单,按数字顺序排列的菜单项显示在标准错误上,并显示PS3提示符,等待用户输入 1. 用户输入菜单列表中的某个数字,执行相应的命令 3、 用户输入被保存在内置变量 REPLY 中 4、select 是个无限循环,因此要记住用 break 命令退出循环,或用 exit 按 命令终止脚本。也可以按ctrl+c退出循环 5、 select 和 经常和 case 联合使用 6、与for循环类似,可以省略 in list,此时使用位置参量 #### read读取控制台输入 read(选项)(参数) 选项:-p:指定读取值时的提示符 -t:指定读取值时等待的时间(秒) 参数:变量:指定读取值的变量名 ![](https://i-blog.csdnimg.cn/direct/5c49905c77c948509cbeafe1445f2b65.png) #### 自定义函数: ![](https://i-blog.csdnimg.cn/direct/56e82741286a473983c6c566a9d1c3be.png) #### 练习题: 编写一个函数来计算输入的是不是一个质数 ![](https://i-blog.csdnimg.cn/direct/da02841695b24c2b88706b0f29b241a8.png) ![](https://i-blog.csdnimg.cn/direct/1cef387f5bb74c16a6fe7567b1e568ed.png)

相关推荐
无名之逆29 分钟前
Rust 开发提效神器:lombok-macros 宏库
服务器·开发语言·前端·数据库·后端·python·rust
cg501734 分钟前
Spring Boot 的配置文件
java·linux·spring boot
暮云星影1 小时前
三、FFmpeg学习笔记
linux·ffmpeg
rainFFrain1 小时前
单例模式与线程安全
linux·运维·服务器·vscode·单例模式
GalaxyPokemon1 小时前
Muduo网络库实现 [九] - EventLoopThread模块
linux·服务器·c++
mingqian_chu2 小时前
ubuntu中使用安卓模拟器
android·linux·ubuntu
xujiangyan_2 小时前
nginx的反向代理和负载均衡
服务器·网络·nginx
GalaxyPokemon3 小时前
Muduo网络库实现 [十] - EventLoopThreadPool模块
linux·服务器·网络·c++
自由鬼3 小时前
开源虚拟化管理平台Proxmox VE部署超融合
linux·运维·服务器·开源·虚拟化·pve