shell编程扫盲

大部分内容参考自清华大学出版社<<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 停止当前脚本
posted @   WangChangAn  阅读(5)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· Blazor Hybrid适配到HarmonyOS系统
· Obsidian + DeepSeek:免费 AI 助力你的知识管理,让你的笔记飞起来!
· 解决跨域问题的这6种方案,真香!
· 一套基于 Material Design 规范实现的 Blazor 和 Razor 通用组件库
· 分享4款.NET开源、免费、实用的商城系统
点击右上角即可分享
微信分享提示