shell scripts 学习记录

news2024/9/22 1:24:24

在这里插入图片描述

shell scripts 学习记录

    • 1. 环境变量的使用
    • 2. Shell中的数组使用
      • Array
      • 关联数组 (理解为python中的字典)
    • 3. shell中的基本运算符
    • 4. shell 中流程控制语法
      • case...esac使用
    • 5. 函数定义与调用
      • 5.1 带返回值的函数
      • 5.2 带传参数的函数
    • 6. shell 中的输入/输出重定向
      • 6.1 输出重定向
      • 6.2 输入重定向
      • 6.3 错误文件重定向
      • 6.4 Here Document使用
      • 6.5 /dev/null的使用
    • 小坑总结
      • 单引号和双引号输出变量存在的问题
      • condition 括号(())、[]、[[]]使用总结
      • 多行注释
      • `$()`和`${}`的区别

1. 环境变量的使用

shell中的环境变量分为env和set两种:

  • set:仅在当前变量shell中成生效.
  • env:仅在当前会话中生效
env        # 查看环境变量
set 
export       # 设置环境变量
unset        # 删除环境变量
$            # 引用变量
=            # 设置变量赋值
#            # 获取变量长度

2. Shell中的数组使用

Array

数组中可以存放多个值,Bash Shell 只支持一维数组,使用语法如下:

array_name=("cxk" 123 "wjk" 'wyf')
echo ${array_name[0]}
echo ${array_name[1]}
echo ${array_name[2]}
echo ${array_name[3]}
echo ${array_name[*]}     # 一行输出所有元素
echo ${#array_name[*]}    # 输出数组的长度 也可以使用${#array_name[@]}

# 执行结果输出为:
cxk
123
wjk
wyf
cxk 123 wjk wyf
4

注意:数组中可以存储不同类型的元素。

关联数组 (理解为python中的字典)

Bash 支持关联数组,可以使用任意的字符串、或者整数作为下标来访问数组元素。使用语法如下:

# declare -A xxx
declare -A array_name
array_name["cxk"]=25
array_name["wyf"]=30
array_name[1949]="10.1"
# 取出关联数组汇总的元素,需要指定key
echo ${array_name["cxk"]}
echo ${array_name["wyf"]}
echo ${array_name[1949]}
echo ${#array_name[@]}   # 数组的长度
echo ${#array_name["cxk"]}  # 某个key对应value的长度 字符型key
echo ${#array_name[1949]}   # 某个key对应value的长度 整数key
echo ${array_name[*]}     # 一行输出所有的value
echo ${!array_name[*]}    # 通过添加!取出所有的key

# 执行结果为:
25
30
10.1
3
2
4
10.1 25 30
cxk wyf 1949
  1. 字典需要根据指定key读取对应的value,且所有类型value的长度都可以通过#提取到。
  2. 输出value的是无序的。

3. shell中的基本运算符

常用的运算符有:

  • 算数运算符
  • 关系运算符
  • 布尔运算符
  • 字符串运算符
  • 文件测试运算符

原生的bash不支持简单的数学运算,可以通过expr实现

#!/bin/bash
a=2
b=4

val=`expr ${a} + ${b}`   
echo "a + b : $val"    
val=`expr ${a} - ${b}`
echo "a - b : ${val}"
val=`expr ${a} \* ${b}`  # 乘法需要注意使用 \*
echo "a * b : ${val}"
val=`expr ${a} / ${b}`   # shell只支持整数运算,这种除不尽的,不同版本的shell结果不一致
echo "a / b: ${tmp}"
val=`expr ${b} / ${a}`
echo "b / a : ${val}"

# 执行结果为:
a + b : 6
a - b : -2
a * b : 8
a / b: 7
b / a : 2
  1. expr 后面表达式需要空格分明,即 $a + $b,而不是$a+$b
  2. 完成的表达式需要用``包含起来,不是单引号,是ESC下面的符号。

4. shell 中流程控制语法

case…esac使用

echo "请输入1到4的数字:"
echo "你输入的数字为:"
read num

case ${num} in
	1) command      # 你输入的数字为1,执行后续的command
	;; # 两个分号
	2) command     
	;;
	3) command
	;;
esac                # 结束符

if else条件中如果:

  • 使用-gt-lteq之类的逻辑操作,那么使用[...]括号
  • 使用<>==之类的计算操作,那么使用((...))括号
# 字符串
read pattern
case "${pattern}" in
	"wjk") echo "这里是王俊凯"
	;;
	"wyf") echo "skr,skr!"
	;;
	"cxk") echo "时长两年半"
	;;
	*)	echo "找不到该明星"      
	;;
esac

注意:用*)来接受其它情况

5. 函数定义与调用

5.1 带返回值的函数

#!/bin/bash
# 函数声明
fun_with_return(){
        echo "这个函数会对输入的两个数字进行相加..."
        echo "输入第一个数字:"
        read first_num
        echo "输入第二个数字:"
        read second_num
        return $((${first_num} + ${second_num}))
}

fun_with_return     # 调用函数
echo "相加的和为:$?!"

-------------------------------------------------------------
# 执行结果得到:
这个函数会对输入的两个数字进行相加...
输入第一个数字:
8
输入第二个数字:
9
相加的和为:17!

5.2 带传参数的函数

#!/bin/bash
# 带传参函数声明
fun_with_parameters(){
        echo "第一个参数为$1"
        echo "第二个参数为$2"
        echo "第10个参数为$10"
        echo "第10个参数为${10}"
        echo "第11个参数为${11}"
        echo "参数总共有$#个"
        echo "直接作为一个字符串打印所有参数$*"

}
# 函数调用,后面直接跟上所传递的参数
fun_with_parameters wo xin 3 4 5 6 7 8 9 fei teng la 

执行结果如下,可以发现第10个参数用{}不用{}的结果是不一样的:

在这里插入图片描述
直接在vim进入该文件,如下图所示,发现$符号只能识别1~9.
$10 不能获取第十个参数,获取第十个参数需要${10}

在这里插入图片描述

n>=10时,需要使用${n}来获取参数。

6. shell 中的输入/输出重定向

需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

6.1 输出重定向

command1 > file1        # 输出重定向,将command1执行的结果输出到文件file1中(覆盖)
command2 >> file2       # 在末尾换行追加

# 实例,将两个结果先后写到一个文件里去
ls -l > forwardtest.sh
ls >> forwardtest.sh

# 可以看到>>的追加形式,会自动换到当前文件内容的下一行进行追加

在这里插入图片描述

6.2 输入重定向

# 统计forwardtest.sh文件的行数
wc -l < forwardtest.sh       # 读取forwardtest.sh文件内容
# 执行结果为:
19

wc -l forwardtest.sh         # 
# 执行结果为:
19 forwardtest.sh

区别:前者不会输出文件名,后者会输出文件名.

6.3 错误文件重定向

一般情况下,每个 Unix/Linux 命令运行时都会打开三个文件1

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。
command 2>file1     # 将错误信息重定向到file1文件中
command 2>>file1    # 追加


# 希望将stdout和stderr合并输出到指定文件
command > file1 2>&1
或者
command >> file1 2>&1


command < file1 > file2   # 从file1读取,执行command后,将结果输出到file2

6.4 Here Document使用

# 它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
command << delimiter
    document
delimiter

# 实例:
cat << +
cxk
wjk
wyf
+

# 执行结果为:
cxk
wjk
wyf

解析:

  • cat:表示command,需要执行的命令
  • <<:这是 Here Document 的开始标记,它告诉 Shell 后面会有一个多行文本块。
  • delimiter:可以由用户任意指定,当然一般用EOF比较合适,delimiter用于表示后续文本的开始和结束。
  • cxk wjk wyf:表示多行文本块中的文本内容

执行过程:

  • 当shell遇到<< +,则会从下一行开始读取,将所有行知道遇到+为止的所有内容都是为一个文本块,然后将这个文本块作为输入传递给cat命令,最后由cat命令将该内容块打印到屏幕中

6.5 /dev/null的使用

# 如果希望执行某个命令的输出结果,不显示在屏幕上,那么可以将其重定向为/dev/null
command > /dev/null

# 如果希望屏蔽stdout和stderr
command > /dev/null 2>&1

/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。


小坑总结

单引号和双引号输出变量存在的问题

your_name="cxk"
# 使用双引号拼接
name="hello, "${your_name}" !" 
name_1="hello, ${your_name} !"
echo $name  $name_1

# 使用单引号拼接
name_2='hello, '${your_name}' !'
name_3='hello, ${your_name} !'
echo $name_2  $name_3

输出结果如下:

hello, cxk ! hello, cxk !
hello, cxk ! hello, ${your_name} !

显然,在双引号的情况下,${your_name}是能够取出变量中的值.

第三种情况,虽然使用了单引号单引号,但是存在字符串拼接(这里不太理解,我个人感觉两层单引号,也算是双引号了),所以也能够取出${your_name}中的值。而第四种情况name_3中,单引号直接将里面的内容全部当作字符串了,因此直接输出。

condition 括号(())、[]、[[]]使用总结

总体建议:

  • 对于简单的条件判断,使用方括号[]是通用的做法,适用于大多数的 POSIX 兼容 Shell。
  • 对于复杂的条件测试,如模式匹配、逻辑运算等,使用双方括号 [[]] 更为合适,特别是在 Bash Shell 中。
  • 对于数值比较和算术运算,使用双圆括号(())更为合适,它提供了便捷的数值操作。

多行注释

参考Here Document用法,将内容丢给:,然而:不会做任何操作,因此可以充当注释使用,

: >> delimiter
内容
delimiter

# 例如:
: >> COMMENT
内容
COMMENT

$()${}的区别

  • $()用于将一个命令的输出结果作为一个整体来替换。例如,result=$(command) 会将 command 的输出结果存储在 result 变量中。${}可以在变量的值中插入命令的输出结果。
  • 通常情况下,推荐使用$()来进行命令替换,而使用${}来进行变量替换和参数替换。

  1. 菜鸟教程 ↩︎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/888022.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

糖尿病视网膜病变,黄斑病变,年龄相关检测研究(Matlab代码)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

sCrypt于8月12日在上海亮相BSV数字未来论坛

2023年8月12日&#xff0c;由上海可一澈科技有限公司&#xff08;以下简称“可一科技”&#xff09;、 临港国际科创研究院发起&#xff0c;携手美国sCrypt公司、福州博泉网络科技有限公司、复旦大学区块链协会&#xff0c;举办的BSV数字未来论坛在中国上海成功落下帷幕。 本次…

好消息!多地明确鼓励提取公积金作首付

大家好&#xff01; 我是老洪&#xff0c;看到一则公积金资讯&#xff0c;聊两句。 据媒体报道&#xff0c;多地明确鼓励提取公积金作首付。 我个人觉得鼓励提取公积金作首付&#xff0c;对于购房者来说挺好的。 这种做法不仅可以减轻首付资金压力&#xff0c;还可以提高购房者…

出现丢包问题的情况以及解决方法

为什么会出现丢包&#xff1f; 我们在网络上传输数据的时候&#xff0c;数据需要经过很多的路由器/交换机&#xff08;交通枢纽&#xff09;进行传输&#xff0c;而路由器/交换机的结构是很复杂的&#xff0c;传输的数据量也是不确定的&#xff0c;可能这一会传输的数据比较少&…

mysql 03.查询(重点)

先准备测试数据&#xff0c;代码如下&#xff1a; -- 创建数据库 DROP DATABASE IF EXISTS mydb; CREATE DATABASE mydb; USE mydb;-- 创建student表 CREATE TABLE student (sid CHAR(6),sname VARCHAR(50),age INT,gender VARCHAR(50) DEFAULT male );-- 向student表插入数据…

vscode用ssh远程连接linux

1、vscode是利用ssh远程连接linux的&#xff0c;所以首先确保vscode已经安装了这两个插件 2、点击左下角的连接 3、选择Connect to Host…… 5、按格式输入 ssh 主机名ip 比如我的&#xff1a;ssh mnt192.168.198.128 6、选择第一个打开配置文件&#xff0c;确保输入正确 7、…

el-table :span-method合并单元格

2023.8.17今天我学习了如何使用el-table进行单元格的合并&#xff0c;效果如下&#xff1a; 在开发的过程中&#xff0c;如果有多个重复的值&#xff0c;我们希望可以进行合并显示&#xff0c;这样就不会显得重复太多&#xff0c;el-table有自带的方法&#xff1a; Element - …

安装编译器

安装MinGW&#xff0c;下载地址&#xff1a; MinGW-w64 - for 32 and 64 bit Windows - Browse Files at SourceForge.net 下载x86_64-win32-seh&#xff0c;下载完解压到相应的路径下。

Leetcode-每日一题【剑指 Offer 32 - I. 从上到下打印二叉树】

题目 从上到下打印出二叉树的每个节点&#xff0c;同一层的节点按照从左到右的顺序打印。 例如: 给定二叉树: [3,9,20,null,null,15,7], 3 / \ 9 20 / \ 15 7 返回&#xff1a; [3,9,20,15,7] 提示&#xff1a; 节点总数 < 1000 解题思路 1.题目要求我们从…

创建SpringBoot项目报错 - Process finished with exit code 1

错误信息 [ERROR] The build could not read 1 project -> [Help 1] [ERROR] [ERROR] The project com.example:ruoyi-excel-demo:0.0.1-SNAPSHOT (D:\Java\work\ruoyiExcelDemo\pom.xml) has 1 error [ERROR] Non-resolvable parent POM for com.example:ruoyi-e…

爬虫逆向实战(十六)--某建筑市场平台

一、数据接口分析 主页地址&#xff1a;某建筑市场平台 1、抓包 通过抓包可以发现数据接口是list 2、判断是否有加密参数 请求参数是否加密&#xff1f; 无请求头是否加密&#xff1f; 无响应是否加密&#xff1f; 通过查看“响应”模块可以发现&#xff0c;返回的响应是…

【共同缔造 情暖襄阳】 暑期关爱未成年人志愿服务活动合集(三)

结合2023年襄阳市民政局“共同缔造 情暖襄阳”社会工作服务项目&#xff0c;在襄阳市民政局、襄州区民政局支持下&#xff0c;襄州社工协会联合肖湾街道育红社区开展暑期“希望家园”志愿服务活动&#xff0c;关爱未成年人。 8月4日&#xff0c;为培育孩子们广泛的兴趣爱好和动…

【JVM】垃圾回收算法

目录 一、判断对象已“死” 1.1、引用计数算法 1.2、可达性分析算法 1.3、引用的概念 二、垃圾收集算法理论 2.1、分代收集理论 三、垃圾收集算法 3.1、标记--清除算法 3.2、标记--复制算法 3.3、标记--整理算法 一、判断对象已“死” 在堆里面存放着Java世界中几乎所…

AGI 在网易云信的技术提效和业务创新

We believe our research will eventually lead to artificial general intelligence, a system that can solve human-level problems. Building safe and beneficial AGI is our mission. ---- OpenAI 通用人工智能 AGI 作为 AI 的终极形态&#xff0c;是 AI 行业内追求的演…

【制作npm包2】了解 package.json 相关配置

制作npm包目录 本文是系列文章&#xff0c; 作者一个橙子pro&#xff0c;本系列文章大纲如下。转载或者商业修改必须注明文章出处 一、申请npm账号、个人包和组织包区别 二、了解 package.json 相关配置 三、 了解 tsconfig.json 相关配置 四、 api-extractor 学习 五、npm包…

TECHnalysis Research:关于生成式AI的几个意外发现

TECHnalysis Research是一家美国的独立市场调查公司&#xff0c;该调查公司于2023年5月份对于全美10个行业的1000家企业IT决策负责人进行了调研&#xff0c;调研围绕生成式AI及其对于企业业务的影响。就在全球持续升温的生成式AI热度中&#xff0c;TECHnalysis Research的调研结…

第二章 搜索 No.2多源bfs,最小步数与双端队列广搜

文章目录 多源bfs&#xff1a;173. 矩阵距离最小步数&#xff1a;1107. 魔板双端队列bfs&#xff1a;175. 电路维修 根据Dijkstra的正确性可以验证bfs的正确性 多源bfs&#xff1a;173. 矩阵距离 173. 矩阵距离 - AcWing题库 输出01矩阵中的所有点到1的最短曼哈顿距离&#…

构建智能医疗未来:人工智能在线上问诊系统开发中的应用

随着人工智能技术的飞速发展&#xff0c;医疗领域也正在逐步迎来一场革命性的变革。其中&#xff0c;人工智能在在线上问诊系统开发中的应用&#xff0c;正为医疗产业带来全新的可能性。本文将深入探讨如何利用代码构建智能医疗未来&#xff0c;以提升线上问诊系统的效率、准确…

CSAPP Lab2:Bomb Lab

说明 6关卡&#xff0c;每个关卡需要输入一个字符串&#xff0c;通过逆向工程来获取对应关卡的字符串 准备工作 环境 需要用到gdb调试器 apt-get install gdb系统: Ubuntu 22.04 本实验会用到的gdb调试器的指令如下 r或者 run或者run filename 运行程序,run filename就是…

8----代码块

一、行内代码​ 使用一对反引号()来创建行内代码。 如果在行内代码中需要包含反引号本身&#xff0c;可以使用两个反引号对加前后空格来创建。(但是这样的代码块不会进行语法高亮&#xff0c;只是简单地将代码以等宽字体显示) 注&#xff1a;反引号在键盘上位于左上角&#xff…