首页 > 系统相关 >shell编程扫盲

shell编程扫盲

时间:2024-06-01 16:33:21浏览次数:14  
标签:脚本 shell 变量 编程 echo 扫盲 command 2.2

大部分内容参考自清华大学出版社<<Linux编程>>,相关内容会随着笔者的不断学习而增量更新
chatgpt能够完成shell编程的大部分内容,可以在阅读本文后向chatgpt提出需求,适当修改chatgpt给出的代码,再于测试环境进行排错,最后用于生产环境

2.1 Shell编程的基本概念

shell是一种围绕着linux内核所提供的接口的胶水语言,由于linux的接口是C程序,因此各种C程序(如linux的各种CLI命令),都可以被shell语言调用.

2.1.1 Shell脚本的程序结构

可由以下成分组成:
- Linux命令
- 变量与赋值语句
- 输入输出语句
- 流程控制语句

2.1.2 Shell脚本的创建与执行方法

创建:
script.sh

#!/bin/bash
# -*- coding: utf-8 -*-
#注释
#代码段...
echo "helloworld"

执行:

  1. CLI:/bin/bash ./script.sh
  2. CLI:chmod +x ./script.sh && ./script.sh

2.1.3 Shell变量与赋值表达式

shell中的变量和值遵循`key-value`逻辑,值分为数字和"字符串"

变量规则:

  1. 由字母,数字,下划线组成,大小写敏感
  2. 由${variableName}的形式提取变量引用的值,该方式可拼接其他字符,提取未定义的变量会得到空
  3. 使用$(linux_command)解析得到linux命令的返回值

2.1.4 Shell输入输出语句

输入:
将以空格分隔的输入量分别输入到v1,v2...,如果是超量输入,那么所有超量的部分都会被添加到最后一个变量里(此处为v2)
read [-s] [-p "提示字符串"] v1 v2 ...

  • s : slient mode
  • p : promt,即提示词

输出:
echo
可在其后解析变量引用和linux命令的返回值

命令行参数解析:
$num:执行脚本时传入的第n个变量,众所周知$0是脚本名称
$#:执行脚本时传入的变量数量
$@:执行脚本时传入的变量视为一个vector
$*:执行脚本时传入的变量视为一个以空格分隔的string
$?:最后一次命令的返回值,正常是0,可在程序中通过exit num设置

2.2 shell三剑客与管道符和I/O重定向

三剑客直接问chatgpt吧

2.2.1 grep

2.2.2 sed

2.2.3 awk

2.2.4 管道符 |

cmd1 | cmd2:cmd1的输出传递给cmd2的输入

2.2.5 追加>>与阶段添加>

>>:左侧输出追加到右侧文件内容之后
>:左侧输出阶段添加到右侧文件内容之后

2.3 条件与if控制结构

2.3.1 if控制结构

if command
then
    echo "hello"
elif command
then
    echo "HELLO"
else#这行非必须
    echo "world"#这行非必须
fi
###
if cmd;then
command
fi

其中:command的返回结果为0时条件为真(参考$?),若command错误,其返回报错也会输出到脚本的输出结果中

2.3.2 test命令

可使用test condition或者[空格condition空格]来替换if后的command
提供条件检测能力,可处理:

  • 数值比较,
  • 字符串比较,
  • 文件属性检查
  1. 数值比较
    分别使用-加equal(等于)/greetthan(大于)/lessthan(小于)的第一个可识别字母构成:
a   -eq    b   #==
    -lt     #<=
    -gt     #>=
    -le     #<
    -gt     #>
    -ne     #!=
  1. 字符串比较
a   =    b   #==
    !=     #!=
    <      #<
    >      #>
-n a    #a的长度非0
-z a    #a的长度是0
  1. 文件比较
-e  f   #存在
-d  f   #存在且目录
-f  f   #存在且文件
-r  f   #存在且可读
-s  f   #存在且内容非空
-w  f   #存在且可写
-x  f   #存在且可执行
-O  f   #存在且当前用户拥有
-G  f   #存在且当前用户组
f1 -nt f2 #f1新于f2
f1 -oz f2 #f1旧于f2

复合检查
if [expression1]&&[expression2]
if [expression1]||[expression2]

2.3.4 case

用于判断不同条件值与参数值相等的情况

case var in
condition1)
    cmd
    ;;
condition2)
    cmd
    ;;
*)
;;
esac

2.4 循环结构

2.4.1 for循环

支持break和continue
遍历

for i in list
do
    cmd to $i
done

次数控制

for ((i=1;i<=3;i++))
do
    echo "$i"
done

2.4.2 while循环与until循环

while:test command为真则执行循环体

while test command
do
    other command
done

until:test command为假则执行循环体

until test command
do
    other command
done

2.5 shell函数

定义:可以参考c语言函数的签名,其中的argn可以忽略,转而使用$1,$2..的形式提取函数实参,但是使用argn的方式能让传参更有阅读价值

function fname(arg1,arg2){
    echo "hello function"
    return 0
}
#函数调用
fname #不需要函数调用符()

2.6脚本的前台后台切换

  1. 在CLI执行脚本后+&会在后台执行
  2. fg + 脚本job号(就是1.执行后返回的中括号里的数字)可以将后台脚本放到前台
  3. bg +jobs号将脚本放在后台
  4. jobs命令查看所有脚本
  5. ctrl+z 暂停当前脚本
  6. ctrl+c 停止当前脚本

标签:脚本,shell,变量,编程,echo,扫盲,command,2.2
From: https://www.cnblogs.com/djwca/p/18226074

相关文章

  • Linux系统编程之线程
    一.线程介绍1.进程与线程典型的UNIX/Linux进程可以看成只有一个控制线程:一个进程在同一时刻只做一件事情。有了多个控制线程后,在程序设计时可以把进程设计成在同一时刻做不止一件事,每个线程各自处理独立的任务。进程是程序执行时的一个实例,是担当分配系统资源(CP......
  • Linux系统编程之进程间通信(IPC)
    一.进程间通信概述进程间通信(IPC,InterProcessCommunication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中Socket和Streams支持不同主机上的两个进程IPC二.管道1.匿名管道(1)特点1......
  • Java中的网络编程:构建稳健的分布式应用
            网络编程是Java开发中至关重要的一部分,特别是在构建分布式系统和网络应用程序时。Java提供了丰富的网络编程API和库,使开发者能够轻松创建各种网络应用。本文将介绍Java中的网络编程基础、常用的网络通信协议、以及如何利用Java构建稳健的分布式应用。####1.......
  • Java多线程编程:提高程序性能与响应性
            多线程编程是利用计算机的多核心优势来提高程序的性能和响应性的重要手段之一。在Java中,通过多线程可以实现同时执行多个任务,充分利用CPU资源,加速程序的运行。本文将深入探讨Java多线程编程的基本概念、常用类库、并发问题以及最佳实践。####1.多线程基础概......
  • (中文参数)可编程逻辑IC 5SGXEB6R2F40I2G、5SGXEB6R2F40I3G、5SGXEB6R3F40I3G、5SGXEB6R
    概述StratixV是业内第一款可提供精度可变DSP模块的FPGA,这使得它可提供业内效率最高、性能最好的多精度DSP数据通路和功能,如FFT、FIR和浮点DSP。StratixVFPGA具有1.6Tbps串行交换能力,采用各种创新技术和前沿28-nm工艺,突破带宽瓶颈,降低了宽带应用的成本和功耗。StratixVFP......
  • PowerShell实现定时备份并清理文件夹数据
    脚本backup.ps1#设置执行策略以允许脚本运行Set-ExecutionPolicyBypass-ScopeProcess-ForceWrite-Host"正在备份文件,请勿关闭...."#设置源目录和目标备份目录#备份源文件路径$SOURCE_DIR="D:\data\app\images"#备份目标路径$BACKUP_DIR="D:\data\backup"$......
  • Xshell安装(免费可用)和使用教程
    Xshell使用方式Xshell是一款功能强大的终端模拟器,用于远程访问和管理服务器。它支持多种协议,如SSH1/SSH2、Telnet、Rlogin、Serial等。本文将介绍Xshell的基本使用方法。1.安装与启动首先,从官网下载Xshell安装包,然后按照提示进行安装。安装完成后,启动Xshell。2.创建......
  • Shell阶段08 数组(普通数组, 关联数组), 示例(数组的遍历与循环)
    数组基本概述#shell的数组用的比较少,一般都用awk。因为shell的数组比awk慢很多什么是数组简单来说:数组其实就是变量的一种,变量只能存储一个值,而数组可以存储多个值数组的分类分为两类普通数组关联数组普通数组:只能使用正整数作为数组索引关联数组:可以使用......
  • 1940java swing零售库存管理系统myeclipse开发Mysql数据库CS结构java编程
    一、源码特点   javaswing零售库存管理系统是一套完善的窗体设计系统,对理解SWINGjava编程开发语言有帮助,系统具有完整的源代码和数据库,,系统主要采用C/S模式开发。应用技术:java+mysql开发工具:Myeclipse8.5、jdk。java零售商品库存管理系统二、功能介绍零售库......
  • 1882java密室逃脱管理系统 Myeclipse开发mysql数据库web结构java编程计算机网页项目
    一、源码特点java密室逃脱管理系统是一套完善的web设计系统,对理解JSPjava编程开发语言有帮助采用了java设计,系统具有完整的源代码和数据库,系统采用web模式,系统主要采用B/S模式开发。开发环境为TOMCAT7.0,Myeclipse8.5开发,数据库为Mysql,使用java语言开发。二、功能介绍(1)......