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

打印 上一主题 下一主题

主题 510|帖子 510|积分 1530

参考链接:
  

  • Shell编程 4小时快速上手_哔哩哔哩_bilibili
  • linux shell 脚本 入门到实战详解[⭐建议收藏!!⭐]-CSDN博客
  
  
根本知识预备

文本命令

cat

cat命令的常勤奋能是将文件内容打印并输出到屏幕上。
  1. cool@cool:~/Shell_Learning$ vim demo.txt
  2. cool@cool:~/Shell_Learning$ cat demo.txt
  3. hello
  4. world
  5. this is a test
复制代码
除此之外,cat命令也能创建和编辑新文件,由于该用法用的不多,以是作者就不在这里展开讨论了。
echo

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


  • >为重定向符号,可以将内容追加到文件中,如果有同名文件会先扫除原文件所有内容
  • >>为追加重定向符号,不会扫除文件的内容,而是将对应内容追加到文件的末尾行
  1. cool@cool:~/Shell_Learning$ echo "hello"
  2. hello
  3. cool@cool:~/Shell_Learning$ echo "hello">hello.txt
  4. cool@cool:~/Shell_Learning$ cat hello.txt
  5. hello
  6. cool@cool:~/Shell_Learning$ echo "world">>hello.txt
  7. cool@cool:~/Shell_Learning$ cat hello.txt
  8. hello
  9. world
复制代码
grep

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

sed/awk

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


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

vim文本编辑器,是由 vi 发展演变过来的文本编辑器,使用简单、功能强盛、是 Linux 浩繁发行版的默认文本编辑器。
vim编辑器主要有三种工作模式:


  • 命令模式:不能编辑文件,只能通过快捷键进行一些操作(如移动光标、复制、粘贴、删除字符/整行等),打开vim后默认进入命令模式。
  • 末行模式:可在末行输入一些命令对文件进行操作(如搜刮、更换、生存、退出、高亮等)。
  • 编辑模式:在命令模式下按下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支持情况:
  1. cat /etc/shells
复制代码
在我的Ubuntu20.04执行该命令,结果如下:
  1. cool@cool:~/Shell_Learning$ cat /etc/shells
  2. /bin/sh/bin/bash/usr/bin/bash/bin/rbash/usr/bin/rbash/bin/dash/usr/bin/dash
复制代码
可以通过以下命令检察当前Linux系统默认的Shell
  1. echo $SHELL
复制代码
输出结果一样平常是:/bin/bash
脚本创建

shell脚本文件第一行一样平常第一行会指出由哪个程序(解释器)来执行脚本中的内容,一样平常为:
  1. #!/bin/bash
复制代码
其他内容就根据我们的需求编辑就行,可以是我们在shell终端输入的命令,也可以包罗选择语句、循环语句、shell函数等,详细写法不在本章展开。
脚本执行

执行脚本文件一样平常有4种方法。

  • bash demo.sh
  • ./demo.sh
  • source 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 情况变量

常见的系统情况变量:
  1. $0                 当前脚本的名称;
  2. $n                 当前脚本的第n个参数,n=1,2,…9;
  3. $*                 当前脚本的所有参数(不包括程序本身);
  4. $#                 当前脚本的参数个数(不包括程序本身);
  5. $?                 前一个命令或程序执行完后的状态,返回0表示执行成功;
  6. $$                 程序本身的PID号。
  7. PATH                  命令所示路径,以冒号为分割;
  8. HOME                  打印用户家目录;
  9. SHELL                 显示当前Shell类型;
  10. USER                  打印当前用户名;
  11. ID                    打印当前用户id信息;
  12. PWD                   显示当前所在路径;
  13. TERM                  打印当前终端类型;
  14. HOSTNAME    显示当前主机名;
  15. HISTSIZE    历史命令大小,可通过 HISTTIMEFORMAT 变量设置命令执行时间;
  16. RANDOM      随机生成一个 0 至 32767 的整数;
  17. HOSTNAME    主机名
复制代码
情况变量可以在终端中设置和创建,但是终端关闭后变量值就会丢失,如果想永世生存情况变量,可以将变量配置在:


  • 用户家目录下的bash_profile或bashrc文件中
  • 全局配置/etc/bashrc或/etc/profile文件中定义。
    自定义情况变量的方式:
  1. # 按照系统规范,所有环境变量的名字均采用大写形式。等号两边不能有空格
  2. export NUM=1
  3. # 或者
  4. NUM=100
  5. export NUM
复制代码
检察情况变量:
  1. env
复制代码
检察当前Shell的所有变量,包罗全局变量和局部变量:
  1. set
复制代码
取消定义的情况变量:
  1. unset
  2. NUM
复制代码
2.2 普通变量

普通变量(本地变量/局部变量)在用户当前Shell生存期的脚本中使用,这个值只在用户当前Shell生存期中有意义。如果在Shell中启动另一个进程或退出,那么变量的值将会无效。
为普通变量赋值有三种方法:
  1. 变量=value
  2. 变量='value'
  3. 变量="value"
复制代码


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

  • 将命令结果赋值给变量
  1. 变量=`ls`
  2. 变量=$(ls)
  3. # 示例:
  4. a=`ls`
  5. echo $a
复制代码

  • 当变量背面连接有其他字符的时候,必须给变量加上大括号{}
  • 连续字母、数字打印
  1. echo {a..z}
  2. # 输出为: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
  3. echo {1..9}
  4. # 输出为:1 2 3 4 5 6 7 8 9
复制代码

  • $?:用于获取执行上一个指令的执行状态返回值,0体现乐成,非0体现失败。
三、Shell运算符与条件测试

仅列举几个常用的:
在[]中使用的比较符号在(())和[[]]中使用的比较符号说明-eq==或=相等-ne!=不相等-gt>大于-ge>=大于等于-lt<小于-le<=小于等于二元数字在[]中使用-gt、-le类符号的比较:
  1. [ 2 -gt 1 ] && echo 1 || echo 0  # 输出为1
  2. [ 2 -lt 1 ] && echo 1 || echo 0  # 输出为0
复制代码
二元数字在(())中的比较。
  1. ((3>2)) && echo 1 || echo 0
  2. ((3<2)) && echo 1 || echo 0
  3. ((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语句

语法如下:
  1. # 单分支结构
  2. if <条件表达式>;then
  3.         指令
  4. fi
  5. # 双分支结构
  6. if <条件表达式>;then
  7.         指令
  8. else
  9.         指令
  10. fi
  11. # 例如:
  12. if [ -f "$file1" ];then
  13.         echo 1
  14. else
  15.         echo 0
  16. fi
复制代码
4.1.2 read命令



  • -p prompt:设置提示信息。
  • -t timeout:设置输入等候的时间,单元默认为秒。
  1. read -t 10 -p "input a number:" num # 变量前需要有空格 -t 10 等待10s
  2. echo $num
  3. read -t 10 -p "input two number:" num1 num2 # 变量前需要有空格
  4. echo $num1 $num2
复制代码
4.1.3 case语句

case条件语句相称于多分支的if/elif/else条件语句,但是它比这些条件语句看起来更规范更工整。
语法格式如下:
  1. case "变量" in        值1)                指令..                ;;        值2)                指令..                ;;        *)                指令..esac# 示例:#!/bin/bash
  2. read -p "input a number:" numcase "$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循环

  1. while <条件表达式>
  2. do
  3.         指令
  4. done
  5. # 示例:
  6. while true # 条件为真一直运行
  7. do
  8.         uptime
  9.         sleep 2 # 让程序暂停2秒,控制循环的频率,否则会消耗大量的系统资源
  10. done
复制代码
4.2.2 for循环

  1. for 变量名 in 变量取值列表
  2. do
  3.         指令
  4. done
复制代码
4.3 shell函数

标准写法:
  1. # 函数声明:
  2. function 函数名() {
  3.         指令
  4.         return n
  5. }
  6. # 函数调用:
  7. # 执行不带参的函数时,直接输入函数名
  8. function
  9. # 执行带参的函数时
  10. function 参数1 参数2
复制代码
shell中的break、continue、exit、return:


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


  • 脚本天生一个 100 以内的随机数,提示用户猜数字,根据用户的输入,提示用户猜对了,猜小了或猜大了,直至用户猜对脚本竣事。
  1. #!/bin/bash
  2. num=$[RANDOM%100+1]while trueread -p "猜一个1到100之间的数:" guessdo        if [ $num -gt $guess ];then                echo "猜小了"         elif [ $num -lt $guess ];then                echo "猜大了"        elif [ $num -eq $guess ];then                echo "恭喜你!猜对了!"                break        else                echo "请按要求输入数字!"        fidone
复制代码

  • 复制文件并显示进度条。
  1. #!/bin/bash
  2. jindu(){        while true        do                echo -n "#"                sleep 0.2        done}cur_path=$PWDecho "开始创建新文件夹..."mkdir $cur_path/jindu1 $cur_path/jindu2if [ $? -eq 0 ];then        file1_path=$cur_path/jindu1        file2_path=$cur_path/jindu2        echo "新文件夹创建乐成!"fitouch $file1_path/test111.txtjindu &  # 这里的&体现将jindu函数放在背景运行JINDU_PID=$!cp -a $file1_path $file2_pathsleep 2 kill $JINDU_PIDecho -e "\n拷贝完成!"sleep 0.5rm -rf $file1_path $file2_pathif [ $? -eq 0 ];then        echo "脚本运行完毕,已自动将文件删除"fi
复制代码

  • 更多实例可以参考:

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


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

正序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

花瓣小跑

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表