Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >技术栈系列基础篇1-shell

技术栈系列基础篇1-shell

原创
作者头像
AndreKzWu
修改于 2022-09-21 09:14:10
修改于 2022-09-21 09:14:10
7220
举报
文章被收录于专栏:AndrekzWu的专栏AndrekzWu的专栏

一、简介

1.1、 什么是shell

  • Shell是用C语言编写的程序
  • Shell是一种应用程序,该应用程序提供一个界面,用户通过界面访问linux

1.2、Shell脚本

Shell 脚本,是Shell编写的脚本程序,后缀名为 .sh

1.3、Shell环境

Shell 常见的编辑器种类如下:

  • sh - 即Bourne Shell,sh 是 Unix标准默认的shell
  • bash - 即Bourne Again Shell。bash是Linux标准默认的shell
  • zsh - 功能强大的 shell 与脚本语言

shell脚本定脚本解释器

  • 指定sh 解释器,unix标准默认#!/bin/sh#!/bin/bash
  • 指定bash解释器,linux标准默认

1.4、模式

Shell 有交互和非交互模式

交互模式

代码语言:txt
AI代码解释
复制
shell交互模式为用户在界面执行命令行
例如:
➜  ~ ls -l

非交互模式

代码语言:txt
AI代码解释
复制
shell的非交互模式为执行shell脚本
例如:
➜  bat git:(master) sh andreserver_lanproxy_login.sh

二、基本语法

2.1、解释器

在shell脚本中,#! 描述该shell脚本所使用的解释器,详见1.3 例如:

代码语言:txt
AI代码解释
复制
#!/bin/sh 或 #!/bin/bash

2.2、注释

shell脚本的语法中,注释方式有以下两种

  • 单行注释,用 # 开头,例如 # 这是一行shell注释
  • 多行注释,用:<<EOF开头,EOF结束,例如
代码语言:txt
复制
代码语言:txt
AI代码解释
复制
:<<EOF
代码语言:txt
AI代码解释
复制
这是多行shell注释
代码语言:txt
AI代码解释
复制
EOF
代码语言:txt
复制

2.3、字符串输出

echo用于字符串输出

代码语言:txt
AI代码解释
复制
echo "hello,world"

printf用于格式化输出

代码语言:txt
AI代码解释
复制
printf "$d %s" 1 "hello"
# output: 1 hello

2.4、双引号""、单引号''、反引号

<font color=blue>双引号""、单引号''、反引号 的区别</font>

双引号"": 可识别转义和变量,对变量和转义进行扩展平铺

单引号'': 不识别转义和变量,原样输出

反引号``: 用于执行命令,作用和$(命令)相似

三、变量

3.1、变量命名

  • 只能使用英文字母、数字、下划线,首字母不能是数字
  • 赋值 = 前后不能有空格
  • 不能使用bash的关键字

3.2、声明变量

<font color=red> 访问变量的语法为 ${var} 和 $var,大括号是用来识别变量边界,可加可不加,建议加上</font>

例如:

代码语言:txt
AI代码解释
复制
name="andrekzwu"
echo "${name}"
# output: andrekzwu

3.3、只读变量

设置只读变量语法为: readonly 变量

例如:

代码语言:txt
AI代码解释
复制
name="andrekzwu"
echo ${name}
readonly name
# name="wukezheng" 执行会报错,例如:test.sh: line 6: name: readonly variable

3.4、删除变量

删除变量的语法为:unset 变量

例如:

代码语言:txt
AI代码解释
复制
name="wukezheng"
echo "${name}"
# output: wukezheng
unset name # 删除了变量

3.5、变量类型

  • 局部变量,局部变量只在某个脚本内部有效,不能被其他程序和脚本访问
  • 环境变量,环境变量是当前shell会话内的所有程序和脚本都可访问的变量,使用 export关键字可以设置为环境变量

常见环境变量

  • $HOME,用户目录
  • $PATH,系统路径,用分号分隔的目录列表,shell会从这些目录中找到路径
  • $PWD,当前工作目录
  • $UID,当前用户ID

四、运算符

<font color=red>执行命令时,命名、变量、符号之间需要空格隔离</font>

例如,执行整数运算:

代码语言:txt
AI代码解释
复制
expr $x + $y

例如执行if命令

代码语言:txt
AI代码解释
复制
if [ $x -ne $y ]; then
echo "${x}不等于${y}"
fi

4.1、算术运算符

算术运算符,例如 变量x 为10,变量y为20:

expr 对整数进行运算

运算符

说明

举例

加法

expr $x + $y 结果为30

减法

expr $x - $y 结果为-10

乘法

expr $x * $y 结果为200

/

除法

expr $y / $x 结果为2

%

取余

expr $y % $x 结果为0

=

赋值

x=$y,将y的结果赋值给x, 注意赋值符号前后不能有空格

==

相等,比较两个数字,相等返回true

[ $x == $y ] 返回false

!=

不相等,比较两个数字,不同则返回true

[ $x != $y ] 返回true

4.2、关系运算符

<font color=blue>关系运算符只支持数字,不支持字符串,除非字符串的值是数字</font>

关系运算符,例如 变量 x为10,变量y为20

运算符

说明

举例

-eq

检测两个数是否相等,相等返回true

[ $x -eq $y ] 返回false

-ne

检测两个数是否不相等,不相等返回true

[ $x -ne $y ] 返回true

-gt

检测左边的数是否大于右边的数,如果是,返回true

[ $x -gt $y ] 返回false

-lt

检测左边的数是否小于右边的数,如果是,返回true

[ $x -lt $y ] 返回true

-ge

检测左边的数是否大于等于右边的数,如果是,返回true

[ $x -ge $y ] 返回false

-le

检测左边的数是否小于等于右边的数,如果是,返回true

[ $x -le $y ] 返回true

4.3、布尔运算符

布尔运算符,例如 变量 x为10,变量y为20

运算符

说明

举例

非运算,表达式为true,则返回false,反之则返回true

[ ! false ] 返回true

-o

或运算,有一个表达式为true,则返回true

[ $x -lt 20 -o $y -gt 100 ] 返回true

-a

与运算,两个表达式都为true才返回true

[ $x -lt 20 -a $y -eq 20 ] 返回true

4.4、逻辑运算符

逻辑运算符,例如 变量 x为10,变量y为20

运算符

说明

举例

&&

逻辑与

[ $x -lt 20 && $y -eq 20 ] 返回true

||

逻辑或

[ $x -lt 20 or $y -gt 100 ] 返回true

4.5、字符串运算符

字符串运算符,例如变量 x为"abc",y为"ABC"

运算符

说明

举例

=

检测两个字符串是否相等,相等返回true

[ $x = $y ] 返回false

!=

检测两个字符串是否相等,不相等返回true

[ $x != $y ] 返回true

-z

检测字符串长度是否为0 ,为0返回true

[ -z $x ] 返回false

-n

检测字符串长度是否为0,不为0返回true

[ -n $x ] 返回true

str

检测字符串是否为空,不为空则返回true

[ $x ] 返回true

4.6、文件测试运算符

运算符

说明

举例

-b file

检测文件是否是块设备文件,如果是,返回true

[ -b $file ] 返回flase

-d file

检测文件是否是目录,如果是,返回true

[ -d $file ] 返回true

-f file

检测文件是否是普通文件,如果是,返回true

[ -f $file ] 返回true

-r file

检测文件是否可读,如果是,返回true

[ -r $file ] 返回true

-w file

检测文件是否可写,如果是,返回true

[ -w $file ] 返回true

-x file

检测文件是否可执行,如果是,返回true

[ -x $file ] 返回true

-s file

检测文件是否为空(文件大小是否大于0),不为空,则返回true

[ -s $file ] 返回true

-e file

检测问价(包括目录)是否存在,如果是,则返回true

[ -e $file ] 返回true

五、控制语句

5.1、条件语句

格式 :

代码语言:txt
AI代码解释
复制
# if语句
if [ $x -eq $y ]; then
		echo "$x 等于 $y"
fi

# if else 语句
if [ $x -eq $y ]; then
		echo "$x 等于 $y"
else 
		echo "$x 不等于 $y"
fi

# if elif 语句
if [ $x -eq $y ]; then
		echo "$x 等于 $y"
elif [ $x -ne $y ]; then
		echo "$x 不等于 $y"
fi

5.2、循环语句

格式:for 循环

代码语言:txt
AI代码解释
复制
# for 循环1
for arg in elem1 elem2 .....elemN 
do
  ### 语句
done

# 例如遍历文件
for file in $(ls);do
  echo $file
done

# for 循环2
for (( i = 0; i < 10; i++ )); do
	echo $i
done

六、函数

函数定义语法:

代码语言:txt
AI代码解释
复制
[ function ] funname [()] {
    action;
    [return int;]
}
  • 函数定义时,function 关键字可有可无。
  • 函数返回值 - return 返回函数返回值,返回值类型只能为整数(0-255)。如果不加 return 语句,shell 默认将以最后一条命令的运行结果,作为函数返回值。
  • 函数返回值在调用该函数后通过 $? 来获得。
  • 所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至 shell 解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

七、参数/流

位置参数变量表:

变量

描述

$0

脚本名

$1 ... $9

第1个到第9个参数列表

${10} ... ${N}

第10个到第N个参数列表

$* or $@

不包括$0在内的所有参数

$#

不包括$0在内的参数个数

$FUNCNAME

函数名称(仅在函数内部有值)

函数处理参数:

另外,还有几个特殊字符用来处理参数:

参数处理

说明

$#

返回参数个数

$* 或$@

返回所有参数

脚本运行的当前进程ID

$!

后台运行的最后一个进程的ID

$?

函数返回值

输出、输出流:

代码

描述符

描述

0

stdin

标准输入

1

stdout

标准输出

2

stderr

标准错误输出

重定向:

operator

desc

重定向输出,以覆盖的方式重定向

&>

重定向输出和错误输出

&>>

以追加的形式重定向输出和错误输出

<

重定向输入,以覆盖的方式重定向

/dev/null文件

/dev/null - 接受并丢弃所有输入; 不产生输出(总是在读取时返回文件结束指示

代码语言:txt
AI代码解释
复制
$ command > /dev/null

如果希望屏蔽 stdout 和 stderr,可以这样写:

代码语言:txt
AI代码解释
复制
$ command > /dev/null 2>&1

若命令执行错误,标准错误输出也给出打印,若想要将标准错误输出不在屏幕输出,则需要使用重定向技术,将标准错误输出重定向到标准输出2>&1

2>&1 <font color=red>&是用来告诉系统,1这里指的是标准输出,而不是文件。</font>

参考文档:https://juejin.cn/post/6844903784158593038#heading-47

参考文档:https://blog.csdn.net/c_base_jin/article/details/87894722

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
一篇教会你写90%的shell脚本!
shell是外壳的意思,就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统,比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说,Shell是一个命令解释器,它通过接受用户输入的Shell命令来启动、暂停、停止程序的运行或对计算机进行控制。
用户7118337
2020/04/12
1.9K0
shell-编写shell脚本所需的基础语法
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
洋仔聊编程
2019/09/18
9190
shell-编写shell脚本所需的基础语法
Shell 学习[通俗易懂]
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
全栈程序员站长
2022/09/09
6920
Linux的Shell编程语法集锦
【GiantPandaCV导语】相信在linux服务器环境下完成算法开发和部署的同学,都有使用shell来实现部分自动化功能的经历,本文就来给大家分享我总结的一些shell语法知识,希望对大家有帮助。
BBuf
2021/08/19
1.7K0
Shell base用法描述
bash中的字符串可以用单引号和双引号,其区别就是,单引号内不能解释变量,而双引号内可以解释变量
郭顺发
2023/07/06
3630
Shell
vim调试,/{匹配字符}可以查找相应的位置,N往后查找下一个,shift+N往前。
matt
2022/10/25
1.3K0
Shell 编程语法基础
在Shell脚本中,定义变量直接赋值即可,使用变量时需要在变量名前加美元符号$,注意定义变量时变量名和等号之间不能有空格。 变量名的命名必须遵循以下规则:
嵌入式视觉
2022/09/05
2.3K0
Shell 编程语法基础
shell基础编程(一)
引言:之前的初识shell的内容简单的介绍了一下shell,帮助大家认识了一下shell 的组成,这篇文章就具体的讲解shell有关的知识。如果大家有编程基础的话。接下来几篇的文章读起来都会非常容易。没有的话也没有关系,我尽最大的可能讲的通俗易懂。那么现在就开始吧
找Bug
2022/12/14
4640
shell基础编程(一)
高级shell脚本编程指南_python的快速入门
什么是shell呢?shell是用C语言编写的程序,它是用户使用 Linux 的桥梁。Shell既是一种命令语言,又是一种程序设计语言。简单来说Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。也可以这样认为,linux中的shell就是linux内核的一个外层保护工具,并负责完成用户与内核之间的交互
全栈程序员站长
2022/11/09
3.2K0
高级shell脚本编程指南_python的快速入门
Mac下Shell脚本基础用法
因为不常用shell,老是边用边查,现在做个小笔记。所有内容来源:Shell 教程
傅_hc
2020/11/03
4.9K0
Mac下Shell脚本基础用法
一篇文章让你彻底掌握 Shell
Ken Thompson 的 sh 是第一种 Unix Shell,Windows Explorer 是一个典型的图形界面 Shell。
硬件开源小站
2023/04/07
2.2K0
4. shell 语法
shell脚本可以直接在命令行中执行,也可以将一套逻辑组织成一个文件,方便复用。 Terminal中的命令行可以看成是一个“shell脚本在逐行执行”。
浪漫主义狗
2022/09/28
2.5K0
Shell基础入门
Shell基础入门 linux系统是如何操作计算机硬件CPU,内存,磁盘,显示器等?使用linux的内核操作计算机的硬件Shell介绍... Shell计算命令 Shell计算命令:expr命令
乐心湖
2021/01/18
2.4K0
Shell基础入门
Linux命令(二)——shell编程
Unix/Linux上常见的Shell脚本解释器有bash、sh、csh、ksh等,习惯上把它们称作一种Shell。我们常说有多少种Shell,其实说的是Shell脚本解释器。
不愿意做鱼的小鲸鱼
2022/09/26
3.9K0
shell 基本语法
jenkins 上构建项目时,经常需要借助 shell 脚本,最近也经常跟服务器打交道,顺便记录些常用命令,方便查阅
请叫我大苏
2019/11/27
1.3K1
Shell编程快速入门指南
字符串可以使用单引号和双引号,单引号中不能包含单引号,即使转义单引号也不次那个,双引号则可以,双引号也可以使用字符串。
用户1515472
2019/07/24
7500
一文掌握shell脚本的基本语法
欢迎大家star我的GitHub:https://github.com/SolerHo/geeks-shell,建议直接使用GitHub来查看排版,发现markdown有错位的情况。
阳光罗诺
2022/01/03
4.2K0
一文掌握shell脚本的基本语法
Shell 快速指南
本文介绍了Linux Shell 的基础知识,包括基本概念、常用命令、快捷键和实用技巧。同时,还介绍了如何通过脚本和工具实现自动化和效率提升。
静默虚空
2018/01/05
3.4K0
Linux Shell编程入门
注意:bash是 Bourne Again Shell 的缩写,是linux标准的默认shell ,它基于Bourne shell,吸收了C shell和Korn shell的一些特性。bash完全兼容sh,也就是说,用sh写的脚本可以不加修改的在bash中执行。
程裕强
2022/05/06
3.1K0
linux shell指令大全整理
所有程序, 包括shell启动的程序, 都能访问环境变量, 在c中通过system()函数执行的结果可以通过环境变量传递回来
全栈程序员站长
2022/11/02
1.7K0
相关推荐
一篇教会你写90%的shell脚本!
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档