Linux Shell编程——从入门到应用

代码能跑就可以 2024-10-20 13:35:01 阅读 54

参考链接:

Shell编程 4小时快速上手_哔哩哔哩_bilibililinux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]-CSDN博客

目录

基础知识准备文本命令catechogrepsed/awk

vim编辑器

一、Shell入门介绍1.1 Shell概述1.2 Shell脚本分类Bourne shellC shell

1.3 Shell脚本的创建与执行脚本创建脚本执行

二、Shell变量2.1 环境变量2.2 普通变量2.3 Shell变量进阶

三、Shell运算符与条件测试四、Shell选择语句、循环语句与函数4.1 选择语句4.1.1 if语句4.1.2 read命令4.1.3 case语句

4.2 循环语句4.2.1 while循环4.2.2 for循环

4.3 shell函数

五、应用实例

基础知识准备

文本命令

cat

<code>cat命令的常用功能是将文件内容打印并输出到屏幕上。

cool@cool:~/Shell_Learning$ vim demo.txt

cool@cool:~/Shell_Learning$ cat demo.txt

hello

world

this is a test

除此之外,cat命令也能创建和编辑新文件,由于该用法用的不多,所以作者就不在这里展开讨论了。

echo

echo命令能将指定文本显示在Linux命令行上,或者通过重定向符写入到指定的文件中。

>为重定向符号,可以将内容追加到文件中,如果有同名文件会先清除原文件所有内容>>为追加重定向符号,不会清除文件的内容,而是将对应内容追加到文件的末尾行

cool@cool:~/Shell_Learning$ echo "hello"

hello

cool@cool:~/Shell_Learning$ echo "hello">hello.txt

cool@cool:~/Shell_Learning$ cat hello.txt

hello

cool@cool:~/Shell_Learning$ echo "world">>hello.txt

cool@cool:~/Shell_Learning$ cat hello.txt

hello

world

grep

grep命令是Linux系统中最重要的命令之一,其功能是从文本文件或管道数据流中筛选匹配的行及数据。

在这里插入图片描述

sed/awk

这两个文本编辑器学习起来难度比较大,且学了不常用容易忘,下面是几篇相关文章:

linux三剑客之流编辑器sed_sed修改配置文件-CSDN博客awk编辑器_awk 打印-CSDN博客

vim编辑器

vim文本编辑器,是由 vi 发展演变过来的文本编辑器,使用简单、功能强大、是 Linux 众多发行版的默认文本编辑器。

vim编辑器主要有三种工作模式:

命令模式:不能编辑文件,只能通过快捷键进行一些操作(如移动光标、复制、粘贴、删除字符/整行等),打开vim后默认进入命令模式。末行模式:可在末行输入一些命令对文件进行操作(如搜索、替换、保存、退出、高亮等)。编辑模式:在命令模式下按下<code>i或 a进入编辑模式,可对文件内容进行编辑。

关于vim编辑器的具体操作可参考:编辑器之神——vim编辑器(详细、完整)-CSDN博客

一、Shell入门介绍

1.1 Shell概述

Shell是一个命令解释器,它的作用是解释执行用户输入的命令及程序等,用户每输入一条命令,Shell就解释执行一条。

Shell存在于操作系统的最外层,负责与用户直接对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,然后输出到屏幕返回给用户。输入系统用户名和密码并登录到Linux后的所有操作都是由Shell解释与执行的。

在这里插入图片描述

1.2 Shell脚本分类

Shell脚本主要分为两大类:Bourne shell和C shell。Linux系统中的主流Shell是bash

Bourne shell

Bourne shell包含三个类型:Bourne shell(sh)、Korn shell(ksh)、Bourne Again Shell(bash)

Bourne shell(sh)是标准的UNIX Shell,很多UNIX系统都配有sh。是Bourne shell(sh)的超集合,并且添加了csh引入的新功能,是目前很多UNIX系统标准配置的Shell。Bourne Again Shell(bash)是各种Linux发行版默认配置的Shell,Linux系统上的/bin/sh往往是指向/bin/bash的符号链接。

C shell

C shell包含两个类型:csh和tsh。

csh支持很多Bourne shell所不支持的功能,例如:作业控制、别名、系统算术、命令历史、命令行编辑等。tcsh是csh的增强版,加入了命令补全等功能,在FreeBSD、Mac OS X等系统上替代了csh。

1.3 Shell脚本的创建与执行

可以通过以下命令查看当前Linux系统的Shell支持情况:

<code>cat /etc/shells

在我的Ubuntu20.04执行该命令,结果如下:

cool@cool:~/Shell_Learning$ cat /etc/shells

/bin/sh

/bin/bash

/usr/bin/bash

/bin/rbash

/usr/bin/rbash

/bin/dash

/usr/bin/dash

可以通过以下命令查看当前Linux系统默认的Shell

echo $SHELL

输出结果一般是:/bin/bash

脚本创建

shell脚本文件第一行一般第一行会指出由哪个程序(解释器)来执行脚本中的内容,一般为:

#!/bin/bash

其他内容就根据我们的需求编辑就行,可以是我们在shell终端输入的命令,也可以包含选择语句、循环语句、shell函数等,具体写法不在本章展开。

脚本执行

执行脚本文件一般有4种方法。

bash demo.sh./demo.shsource demo.sh. demo.sh

前两种方式会在一个新的子 shell 中执行 demo.sh 脚本。这意味着脚本中的所有变量和环境改变都仅在这个子 shell 中有效,而不会影响当前的 shell。

后两种方式会在当前的 shell 环境中执行 demo.sh 脚本。脚本中的所有变量和环境改变都会直接反映在当前的 shell 中。

其中在使用方法2执行脚本文件前,需要给予脚本执行权限:chmod +x demo.sh

二、Shell变量

Shell变量可分为:环境变量(全局变量)和普通变量(局部变量)。

环境变量也可称为全局变量,可以在创建它们的Shell及其派生出来的任意子进程Shell中使用,环境变量又可分为自定义环境变量bash内置的环境变量。普通变量也可称为局部变量,只能在创建它们的Shell函数或Shell脚本中使用。普通变量一般由开发者在开发脚本程序时创建。

2.1 环境变量

常见的系统环境变量:

$0 当前脚本的名称;

$n 当前脚本的第n个参数,n=1,2,…9;

$* 当前脚本的所有参数(不包括程序本身);

$# 当前脚本的参数个数(不包括程序本身);

$? 前一个命令或程序执行完后的状态,返回0表示执行成功;

$$ 程序本身的PID号。

PATH 命令所示路径,以冒号为分割;

HOME 打印用户家目录;

SHELL 显示当前Shell类型;

USER 打印当前用户名;

ID 打印当前用户id信息;

PWD 显示当前所在路径;

TERM 打印当前终端类型;

HOSTNAME 显示当前主机名;

HISTSIZE 历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间;

RANDOM 随机生成一个 0 至 32767 的整数;

HOSTNAME 主机名

环境变量可以在终端中设置和创建,但是终端关闭后变量值就会丢失,如果想永久保存环境变量,可以将变量配置在:

用户家目录下的bash_profile或bashrc文件中全局配置/etc/bashrc或/etc/profile文件中定义。

自定义环境变量的方式:

# 按照系统规范,所有环境变量的名字均采用大写形式。等号两边不能有空格

export NUM=1

# 或者

NUM=100

export NUM

查看环境变量:

env

查看当前Shell的所有变量,包括全局变量和局部变量:

set

取消定义的环境变量:

unset NUM

2.2 普通变量

普通变量(本地变量/局部变量)在用户当前Shell生存期的脚本中使用,这个值只在用户当前Shell生存期中有意义。如果在Shell中启动另一个进程或退出,那么变量的值将会无效。

为普通变量赋值有三种方法:

变量=value

变量='value'

变量="value"

不加任何引号直接定义变量的内容,值里有变量的会被解析后再输出。通过单引号定义。这种定义方式的特点是:输出变量内容时单引号里是什么就输出什么,即使内容中有变量和命令,也会把它们原样输出。通过双引号定义变量。这种定义方式的特点是:输出变量内容时引号里的变量及命令会经过解析后再输出内容。

2.3 Shell变量进阶

将命令结果赋值给变量

变量=`ls`

变量=$(ls)

# 示例:

a=`ls`

echo $a

当变量后面连接有其他字符的时候,必须给变量加上大括号{}连续字母、数字打印

echo { a..z}

# 输出为:a b c d e f g h i j k l m n o p q r s t u v w x y z

echo { 1..9}

# 输出为:1 2 3 4 5 6 7 8 9

$?:用于获取执行上一个指令的执行状态返回值,0表示成功,非0表示失败。

三、Shell运算符与条件测试

仅列举几个常用的:

[]中使用的比较符号 (())[[]]中使用的比较符号 说明
-eq ==或= 相等
-ne != 不相等
-gt > 大于
-ge >= 大于等于
-lt < 小于
-le <= 小于等于
二元数字在[]中使用-gt、-le类符号的比较:

[ 2 -gt 1 ] && echo 1 || echo 0 # 输出为1

[ 2 -lt 1 ] && echo 1 || echo 0 # 输出为0

二元数字在(())中的比较。

((3>2)) && echo 1 || echo 0

((3<2)) && echo 1 || echo 0

((3==2)) && echo 1 || echo 0

文件测试表达式:(这些操作符号对于[[]][]test的测试表达式是通用的)

操作符 说明
-d 文件存在且为目录则为真,则测试表达式成立
-f 文件存在且为普通文件则为真,则测试表达式成立
-e 文件存在则为真,-e不辨别是目录还是文件

字符串测试操作符:

常用字符串测试操作符 说明
-n “字符串” 若字符串的长度不为0,则为真
-z “字符串” 若字符串的长度为0,则为真
“字符串1”=“字符串2” 若字符串1等于字符串2,则为真;可使用"==“替代”="
“字符串1”!=“字符串2” 若字符串1不等于字符串2,则为真

四、Shell选择语句、循环语句与函数

4.1 选择语句

4.1.1 if语句

语法如下:

# 单分支结构

if <条件表达式>;then

指令

fi

# 双分支结构

if <条件表达式>;then

指令

else

指令

fi

# 例如:

if [ -f "$file1" ];then

echo 1

else

echo 0

fi

4.1.2 read命令

-p prompt:设置提示信息。-t timeout:设置输入等待的时间,单位默认为秒。

read -t 10 -p "input a number:" num # 变量前需要有空格 -t 10 等待10s

echo $num

read -t 10 -p "input two number:" num1 num2 # 变量前需要有空格

echo $num1 $num2

4.1.3 case语句

case条件语句相当于多分支的if/elif/else条件语句,但是它比这些条件语句看起来更规范更工整。

语法格式如下:

case "变量" in

值1)

指令..

;;

值2)

指令..

;;

*)

指令..

esac

# 示例:

#!/bin/bash

read -p "input a number:" num

case "$num" in

1)

echo "the num is 1"

;;

2)

echo "the num is 2"

;;

[3-9])

echo "the num is $num"

;;

*)

echo "error!"

;;

esac

4.2 循环语句

4.2.1 while循环

while <条件表达式>

do

指令

done

# 示例:

while true # 条件为真一直运行

do

uptime

sleep 2 # 让程序暂停2秒,控制循环的频率,否则会消耗大量的系统资源

done

4.2.2 for循环

for 变量名 in 变量取值列表

do

指令

done

4.3 shell函数

标准写法:

# 函数声明:

function 函数名() {

指令

return n

}

# 函数调用:

# 执行不带参的函数时,直接输入函数名

function

# 执行带参的函数时

function 参数1 参数2

shell中的breakcontinueexitreturn

break n:如果省略n,则表示跳出整个循环,n表示跳出循环的层数。continue n:如果省略n,则表示跳过本次循环,进入下一次循环;n表示退到第n层继续循环。exit n:退出当前shell程序,n为程序执行的状态返回值。在下一个shell中可以通过$?接收exit的返回值n。return n:作为函数的返回值。

五、应用实例

脚本生成一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,猜小了或猜大了,直至用户猜对脚本结束。

#!/bin/bash

num=$[RANDOM%100+1]

while true

read -p "猜一个1到100之间的数:" guess

do

if [ $num -gt $guess ];then

echo "猜小了"

elif [ $num -lt $guess ];then

echo "猜大了"

elif [ $num -eq $guess ];then

echo "恭喜你!猜对了!"

break

else

echo "请按要求输入数字!"

fi

done

复制文件并显示进度条。

#!/bin/bash

jindu(){

while true

do

echo -n "#"

sleep 0.2

done

}

cur_path=$PWD

echo "开始创建新文件夹..."

mkdir $cur_path/jindu1 $cur_path/jindu2

if [ $? -eq 0 ];then

file1_path=$cur_path/jindu1

file2_path=$cur_path/jindu2

echo "新文件夹创建成功!"

fi

touch $file1_path/test111.txt

jindu & # 这里的&表示将jindu函数放在后台运行

JINDU_PID=$!

cp -a $file1_path $file2_path

sleep 2

kill $JINDU_PID

echo -e "\n拷贝完成!"

sleep 0.5

rm -rf $file1_path $file2_path

if [ $? -eq 0 ];then

echo "脚本运行完毕,已自动将文件删除"

fi

更多实例可以参考:

超级实用的shell脚本100例(一)_shell脚本论坛-CSDN博客超级实用的shell脚本100例(二)_shell脚本100例详解-CSDN博客



声明

本文内容仅代表作者观点,或转载于其他网站,本站不以此文作为商业用途
如有涉及侵权,请联系本站进行删除
转载本站原创文章,请注明来源及作者。