当前位置: 首页 > news >正文

Linux Shell 基础语法 流程控制 逻辑运算 字符串操作详细解析

文章目录

    • 1 shell 简单入门
      • 1.1 shell分类
      • 1.2 shell脚本
      • 1.3 Shell 脚本四种启动方式
    • 2 shell 变量
      • 2.1 普通变量
        • 2.1.1 定义变量
        • 2.1.2 变量中单引号、双引号的区别
        • 2.1.3 将命令的结果赋值给变量
        • 2.1.4 只读变量 readonly
        • 2.1.5 删除变量
      • 2.2 环境变量
        • 2.2.1 环境变量与删除
        • 2.2.2 查看环境变量
      • 2.3 特殊变量
      • 2.4 位置参数
        • 2.4.1 使用脚本文件传递位置参数
        • 2.4.2 使用函数传递位置参数
      • 2.5 键盘输入
    • 3 运算符
      • 3.1 算数运算符
      • 3.2 逻辑运算符
      • 3.3 字符串运算符
      • 3.4 文件测试运算符
    • 4 流程控制
      • 4.1 if 语句
      • 4.2 case条件语句
      • 4.3 循环
        • 4.3.1 for 循环
        • 4.3.2 while循环
        • 4.3.3 until 循环
      • 4.4 流程控制语句
        • 4.4.1 exit
        • 4.4.2 break语句
        • 4.4.3 continue 语句
      • 4.5 函数定义
    • 5 字符串操作
      • 5.1 获取字符串长度
      • 5.2 字符串拼接
      • 5.3 字符串截取
        • 5.3.1 从左边开始
        • 5.3.2 从右边开始
        • 5.3.3 从指定字符(子字符串)开始截取
        • 5.3.4 使用 % 截取左边字符
    • 6 数组

1 shell 简单入门

Shell是一个用C语言编写的程序,它是用户使用linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。
Shell是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
本文主要以shell脚本为重心展开介绍。

1.1 shell分类

Linux shell的种类有很多,目前流行的 Shell 包括 ash、bash、ksh、csh、zsh…,用户可以通过查看/etc/shells文件中的内容查看自己主机中当前有哪些种类的shell。

[root@master shell]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin

查看当前linux正在使用的shell类型

echo $SHELL

$SHELL:是一个环境变量,它记录了Linux当前用户所使用的的shell类型。

1.2 shell脚本

1、编写规范

vim test.sh

#!/bin/bash

# 这是一个注释

echo "Hello World"

#!:是约定标记,告诉系统这个标记需要什么解释器,即需要哪种shell

2、文件命名规则:以 .sh 结尾。

3、执行
shell 脚本是一种解释执行的程序,可以在终端直接调用(需要使用chmod命令赋予脚本执行权限)

chmod +x ./test.sh

4、打印当前进程

#!/bin/bash

echo $$    # 输出当前进程PID

echo "Hello World"

1.3 Shell 脚本四种启动方式

分为如下四种:

1、bash xxx.sh

  • 启动一个bash子进程,运行脚本中的命令

2、./xxx.sh

以脚本的第一行注释为标准

#!/bin/bash:启动一个bash子进程脚本
#!/bin/python:执行一个pyhton脚本

3、source xxx.sh. xxx.sh

在本进程运行这一个脚本,和上面的区别在于会对本进程造成影响

2 shell 变量

在Bash shell中,每个变量都是字符串。

2.1 普通变量

2.1.1 定义变量

variable=value
variable='value'
variable="value"

注意:=周围不能有空格

#!/bin/bash

url=www.couragesteak.com
echo $url

name='有勇气的牛排'
echo $name

author="导演"
echo $author

# {} 可以帮助识别变量边界
echo "I am ${name}."

输出:

www.couragesteak.com
有勇气的牛排
导演
I am 有勇气的牛排.

2.1.2 变量中单引号、双引号的区别

#!/bin/bash

url=www.couragesteak.com

webUrl1='有勇气的牛排官网:${url}'
webUrl2="有勇气的牛排官网:${url}"

echo $webUrl1
echo $webUrl2

单引号' ':被单引号包围时,单引号里面是什么就输出什么。

双引号" ":双引号会解析里面的变量和命令,而不是原样输出。

2.1.3 将命令的结果赋值给变量

语法

variable=`command`	# 不推荐,易混淆
variable=$(command)

实例:

vim log.txt

你真棒
[root@master shell]# log=$(cat log.txt)
[root@master shell]# echo $log
你真棒

2.1.4 只读变量 readonly

使用 readonly命令可以将变量定义为只读变量,其值不可改变

#!/bin/bash

url=www.couragesteak.com
readonly url 

url="ccc"

输出

[root@master shell]# ./test.sh
./test.sh: line 6: url: readonly variable

2.1.5 删除变量

语法:unset 变量名

2.2 环境变量

2.2.1 环境变量与删除

# 使用export声明
export name="有勇气的牛排"
echo $name
# 删除环境变量name
unset name

2.2.2 查看环境变量

查看指定环境变量

env | grep name

查看系统所有环境变量

env

2.3 特殊变量

变量描述
$0当前脚本文件名
$#传递给脚本或函数测参数个数
$*传递给脚本或函数的所有参数
$@传递给脚本或函数的所有参数。但被双引号包含是与@、*稍有不同
$?上个名利的退出状态,或函数的返回值
$$当前Shell进程ID

2.4 位置参数

位置参数变量描述
$nn为数字,$0表示当前Shell脚本程序的名称,$1-9代表第一道第九个参数,十以上的参数需要用大括号包含,如 {10}
$*这个变量代表命令行中所有的参数,$把所有的参数看成一个整体
$@这个变量也代表命令行中的所有参数,不过$@把每个参数区分对待
$#这个变量代表命令行中的所有参数的个数

2.4.1 使用脚本文件传递位置参数

语法:./脚本.sh <参数1> <参数2> ...

实例:

./test.sh charles 有勇气的牛排
#!/bin/bash

echo "参数1: $1"
echo "参数2: $2"

在这里插入图片描述

2.4.2 使用函数传递位置参数

./test.sh
#!/bin/bash

# 定义函数
function func(){
    echo "参数1:$1"
    echo "参数2:$2"
}

# 调用函数
func charles 有勇气的牛排

输出同上一个案例

2.5 键盘输入

read: usage: 
read [-ers] [-a array] [-d delim] [-i text] [-n nchars] [-N nchars] [-p prompt] [-t timeout] [-u fd] [name ...]

-a:后面跟一个变量,多个变量,按顺序赋值
-p:输出提示信息
-t:秒数,等待时间(s)
-n:数字,只接受指定长度字符,就会执行
-s:隐藏输入的数据,适合密码等敏感信息
-d:结束标志
-e:在输入的时候可以使用补全功能。

实例:可补全,输入名字

read -e -p "请输入您的姓名:" -a name

在这里插入图片描述

3 运算符

3.1 算数运算符

原生bash不支持数学运算,不过可以通过其他命令辅助实现。

实例:计算两数之和

#!/bin/bash

res=`expr 1 + 1`在这里插入代码片`
echo "结果:${res}"

echo '1+1='`expr 1 + 1`

3.2 逻辑运算符

运算符描述
-a
-o
!

3.3 字符串运算符

运算符描述举例
=判断2个字符串是否相等[ $a=$b ]
!=判断2个字符串是否不相等[ $a!=$b ]
-z判断字符串长度是否为0[ -z $a ]
-n判断字符串是否不为0[ -n $a ]
str判断字符串是否为空[ $a ]

3.4 文件测试运算符

文件测试运算符主要用于 Linux/Unix 文件的各种属性

操作符描述
-b判断文件是否为 块设备 文件
-c判断文件是否为 字符设备 文件
-d判断文件是否是 目录
-f判断文件是否为 普通文件
-g判断文件是否设置了 SGID 位
-k判断文件是否设置了 粘贴位(Sticky Bit) (可理解为防删除位)
-p判断文件是否有管道
-u判断文案是否设置了 SUID位
-r判断文件是否可读
-w判断文件是否可写
-x判断文件是否可执行
-s检测文件是否为空(文件大小是否>0)
-e检测文件(包括目录)是否存在

用法如:[ -b $file ]

4 流程控制

4.1 if 语句

if-else:判断相等

#!/bin/bash

read a
read b

if(($a == $b))
then
    echo 'a=b'
else
    echo 'a!=b'
fi

if-elif-else:成绩段位判断

#!/bin/bash

read -p "请输入您的分数:" score

if(($score < 60));then
    echo "未及格"
elif (($score >= 60 && $score < 85));then
    echo "还不错"
else
    echo "优秀"
fi

4.2 case条件语句

实例:根据数字判断今天是星期几

#!/bin/bash

printf "星期转换\n"

read -p "请输入今天是一周的第几天:" num

case $num in
    1)
        echo "周一"
        ;;
    2)
        echo "周二"
        ;;
    3)
        echo "周三"
        ;;
    4)
        echo "周四"
        ;;
    5)
        echo "周五"
        ;;
    6)
        echo "周六"
        ;;
    7)
        echo "周天"
        ;;
esac

4.3 循环

4.3.1 for 循环

实例:计算1加到n的和

#!/bin/bash

printf "计算1~n数字之和\n"
read -p "请输入n:" n

for ((i=1;i<=${n};i++))
do
    ((sum += i)) 
done

echo "结果为:$sum"

在这里插入图片描述

4.3.2 while循环

实例:计算1加到n的和

#!/bin/bash

printf "计算1~n数字之和\n"
read -p "请输入n:" n

i=0
while ((i <= n)) 
do
    ((sum += i)) 
    ((i++))
done

echo "结果为:$sum"

4.3.3 until 循环

定义:想判断是否添加是否成立,若成立则进入循环,反之不进入。

#!/bin/bash

printf "计算1~n数字之和\n"
read -p "请输入n:" n

i=0
until ((i>n))
do
    ((sum += i)) 
    ((i++))
done

echo "结果为:$sum"

4.4 流程控制语句

4.4.1 exit

在系统中,用于退出当前用户登录状态

在Shell脚本中,用户退出当前脚本

exit [返回值]

4.4.2 break语句

定义:跳出当前循环

4.4.3 continue 语句

定义:跳过本次循环,继续下一次循环

4.5 函数定义

语法

function 函数名 () {
	程序
}

实例

#!/bin/bash

function getName(){
    printf "name:Charles\n"
}

getName

5 字符串操作

5.1 获取字符串长度

语法:${#您的字符串}

#!/bin/bash

name="有勇气的牛排"
echo "${name}的长度为:${#name}"

5.2 字符串拼接

#!/bin/bash

nick="有勇气的牛排"
obj="博客"

# 连续拼接
str1=$nick$obj  

# 中间加内容
str2="$nick $obj"
str3=$nick":"$obj

# 不规则拼接
str4="这里是${nick}的${obj}"

echo $str1
echo $str2
echo $str3
echo $str4

在这里插入图片描述

5.3 字符串截取

5.3.1 从左边开始

语法:${string : start : length}

#!/bin/bash

str="abcdefgh"
echo ${str:2:3}

输出:cde

5.3.2 从右边开始

语法:${strint : 0-start : length}

#!/bin/bash

str="abcdefgh"
echo ${str:0-2:3}

输出:gh

有点奇怪,以后在测试

5.3.3 从指定字符(子字符串)开始截取

语法:${string#*chars},星号表示通配符,也可以写其他内容。

#!/bin/bash

url="https://www.couragesteak.com/"
echo ${url#*//}

输出:www.couragesteak.com/

5.3.4 使用 % 截取左边字符

#!/bin/bash

url="https://www.couragesteak.com/index.html"

echo ${url%/*}
# 输出:https://www.couragesteak.com

6 数组

在shell中,通过()来表示数组,数组元组之间用空格

#!/bin/bash

# 不要求类型完全相同
arr=(1 2 "有勇气的牛排")

# 后去数组中所有元素
echo ${arr[*]}
echo ${arr[@]}

# 根据下标获取, 起始为0
echo ${arr[2]}

# 数组长度不固定
arr[6]=3
echo ${arr[*]}

在这里插入图片描述

相关文章:

  • 论文速览【RL - Exploration】—— 【Go-Explore】First return, then explore
  • C# 泛型详解(泛型类,方法,接口,委托,约束,反射 )
  • 【云原生】基于Kubernetes的阿里云ACK网络管理
  • Ant Design Vue3中DatePicker 日期选择框如何将接收的数据显示在日期选择框中
  • java计算机毕业设计体育城场地预定系统前台源码+系统+数据库+lw文档+mybatis+运行部署
  • 猿创征文|『单片机原理』程序存储器的结构
  • 【Java 基础】6、Java 对象在 JVM 中的内存布局(详细说明)
  • 不信谣不传谣,亲自动手验证ModelBox推理是否真的“高性能”
  • 树的先序、中序、后序遍历
  • 猿创征文|基于Java+SpringBoot+vue学生课程学习交流考试系统详细设计实现
  • 自动化测试:电商管理系统元素定位练习
  • C# 后端以form格式请求上传附件
  • vue3之provide个inject
  • Es修改索引别名
  • JS 分支语句与循环语句(扩展TODO)
  • 【翻译】Mashape是如何管理15000个API和微服务的(三)
  • Android交互
  • CoolViewPager:即刻刷新,自定义边缘效果颜色,双向自动循环,内置垂直切换效果,想要的都在这里...
  • ES6核心特性
  • exif信息对照
  • express如何解决request entity too large问题
  • Flex布局到底解决了什么问题
  • JavaScript 一些 DOM 的知识点
  • JWT究竟是什么呢?
  • node 版本过低
  • OSS Web直传 (文件图片)
  • Python 基础起步 (十) 什么叫函数?
  • Python利用正则抓取网页内容保存到本地
  • sublime配置文件
  • yii2中session跨域名的问题
  • 类orAPI - 收藏集 - 掘金
  • 码农张的Bug人生 - 见面之礼
  • 配置 PM2 实现代码自动发布
  • 使用SAX解析XML
  • 用quicker-worker.js轻松跑一个大数据遍历
  • LIGO、Virgo第三轮探测告捷,同时探测到一对黑洞合并产生的引力波事件 ...
  • 关于Android全面屏虚拟导航栏的适配总结
  • ​Linux Ubuntu环境下使用docker构建spark运行环境(超级详细)
  • #使用清华镜像源 安装/更新 指定版本tensorflow
  • #数学建模# 线性规划问题的Matlab求解
  • ()、[]、{}、(())、[[]]等各种括号的使用
  • (20050108)又读《平凡的世界》
  • (java)关于Thread的挂起和恢复
  • (附源码)springboot美食分享系统 毕业设计 612231
  • (论文阅读22/100)Learning a Deep Compact Image Representation for Visual Tracking
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十八)devops持续集成开发——使用docker安装部署jenkins流水线服务
  • (四) 虚拟摄像头vivi体验
  • (转) ns2/nam与nam实现相关的文件
  • **python多态
  • .NET Core日志内容详解,详解不同日志级别的区别和有关日志记录的实用工具和第三方库详解与示例
  • .NET Entity FrameWork 总结 ,在项目中用处个人感觉不大。适合初级用用,不涉及到与数据库通信。
  • .net framwork4.6操作MySQL报错Character set ‘utf8mb3‘ is not supported 解决方法
  • .Net mvc总结
  • .net web项目 调用webService