bash shell学习-shell script基础 (笔记)

  A chain no stronger than its weakest link.

  "一着不慎,满盘皆输"

参考资料鸟哥的Linux私房菜 基础学习篇(第三版)

       Linux Shell脚本攻略

         Linux程序设计(第四版)

一、什么是shell script

  1、什么是shell script

    简单来说,shell script(程序化脚本)是利用shell功能所写的一个“程序”,它拥有自己的语法特性

  2、为什么要学shell script

    对于一个初学者来说,我觉得就那么几个原因:

      ①连续命令单一化;

      ②简单的数据处理;

      ③简化常规的系统管理;

  3、注意事项(重要!重要!重要!--重要的事情说三遍)

    ①命令的执行顺序是从上而下,从左而右地分析与执行;

    ②如果读取到一个Enter符号(CR),就尝试开始执行该行(串)命令;

    ③如果命令太长,可以使用\[Enter]来扩展至下一行;

    ④“#”可作为批注(注释),任何加在“#”后面的数据在执行时全部被忽略;

    ⑤命令、参数间的空白(包括Tab键)在执行时都会被忽略;

  4、shell script的文件结构(重要!重要!重要!)

    ①第一行为#!/bin/bash,目的是声明这个script使用的shell名称;

    ②程序内容说明;

    ③主要环境变量和函数的声明;

    ④主程序部分;

    ⑤程序的执行结果;

  5、养成良好的shell script编程习惯(重要!重要!重要!)

    ①功能(批注);

    ②版本信息(批注);

    ③作者和联系方式(批注);

    ④版权声明(批注);

    ⑤历史记录(批注);

    ⑥特殊命令应该用绝对路径的方式来执行;

    ⑦预先声明环境变量;

二、简单的shell script练习

  1、几种常用的范例

    ①交互式脚本:用 read 命令获取用户输入作为变量内容;

    ②随日期变化的文件:利用date命令的执行结果作为文件名的一部分;

    ③简单的数值运算:shell script支持 +、-、*、/、%等运算符上的整数运算;

    ④数值运算的方法:假设a=1,b=2,现在要求a+b并赋值给c,那么可以这样: let c=a+b、c=$((a+b))或者c=$[ a + b ] ;

  2、script的执行方式区别

    ①直接执行或者使用  bash name.sh  方式执行:子进程执行完之后,子进程内各项变量或操作将会结束而不传回到父进程中;

    ②利用  source name.sh  或者  . name.sh  的方式来执行:在父进程中执行;

三、测试语句

  1、利用 test 测试,命令格式: test test_expr

  2、利用  [] ,命令格式: [ test_expr ]  ,使用中括号需要注意以下几点:

    ①在中括号[]内的每个组件都要用空格键来分隔;

    ②在中括号内的变量,最好都以双引号括起来;

    ③在中括号内的常量,最好都以单或双引号括起来;

  3、关于  test_expr  ,见下表

 测试标志 代表意义 
  文件类型判断,如: test -d filename 表示 判断filename是否存在且是一个目录
-e  文件名是否存在 
-f  文件名是否存在且为文件(file) 
-d  文件名是否存在且为目录(directory) 
-b  文件名是否存在且为一个block device设备 
-c  文件名是否存在且为一个character device设备 
-S  文件名是否存在且为一个Socket文件 
-p  文件名是否存在且为一个FIFO(pipe)文件 
-L  文件名是否存在且为一个连接文件 
  文件权限检测,如: test -r filename 表示 判断filename是否可读(root权限例外)
-r  文件名是否存在且具有“可读”权限 
-w  文件名是否存在且具有“可写”权限 
-x  文件名是否存在且具有“可执行”权限 
-u  文件名是否存在且具有“SUID”属性 
-g  文件名是否存在且具有“SGID”属性 
-k  文件名是否存在且具有“Sticky bit”属性 
-s  文件名是否存在且为“非空白文件” 
  两个文件之间的比较,如: test file1 -nt file2 表示 判断file1是否比file2新
-nt  (newer than)更新 
-ot  (older than)更旧 
-ef 是否为同一文件,主要用于判定两个文件是否指向同一个inode 
整数比较,如: [ n1 -eq n2 ] 表示判断n1是否等于n2
-eq  (equal)相等
-ne  (not equal)不相等 
-gt  (greater than)大于 
-lt  (less than)小于 
-ge  (greater than or equal)大于等于 
-le  (less than or equal)小于等于 
 字符串比较
-z string  是否为空串 
-n string  是否不是空串,-n 可省略 
str1 == str2  是否相等 
str1 != str2  是否不等 
 复合判定,如:[ n -ge ‘0‘ -a n -le ‘9‘ ] 表示 判断n是否大于等于0且小于等于9 
-a   与 运算符,都成立才成立
-o  或 运算符,一个成立就成立 
非 运算符,取反 

  4、shell script的默认变量

1 $0: 脚本文件名;$1,$2,...,$i,第i个参数;
2 $#: 参数个数;[email protected]:代表“ "$1"、"$2"、"$3"、...”,每个变量是独立的;$*:代表“ "$1c$2$3c..." ”,c为分隔符,默认为空格;
3 shift: 参数变量号码偏移,shift n 表示将所有变量的变量号码左移n位,变量计数始终从$1开始;

四、条件判断式

  1、if ... then

1 if [ expr1 ]; then
2   dosomething
3 elif [ expr2 ]; then
4   dosomething
5 ...
6 else
7   dosomething
8 fi

  注意:条件表达式可以用  && 、||  连接起来进行复合判断,作用与  -a、-o  一样

  2、case ... esac

 1 case $变量名 in
 2      "var1")
 3           dosomething
 4           ;;
 5      "var2")
 6           dosomething
 7           ;;
 8        ...
 9      *)
10            dosomething
11           ;;
12 esac       

  3、使用函数(function)

1 function fname()
2 {
3   dosomething
4 }

   注意:函数的内置变量与shell script的默认变量类似

五、循环

  1、while do done

1 while [ condition ]
2 do
3   dosomething
4 done

  2、until do done

1 until [ condition ]
2 do
3   dosomething
4 done

  3、for...do...done

1 for var in con1 con2 ...
2 do
3   dosomething
4 done
5 for ((初始值;限制值;执行步长))   --用于数值处理
6 do
7   dosomething
8 done

  补充:使用  seq a b  可以生成a到b的连续序列(整数)

六、shell script的追踪与调试

1 用法:bash [-nvx] script.sh
2 参数:
3 -n  :不要执行,仅查询语法问题
4 -v  :在执行前,先将script的内容输出到屏幕上
5 -x  :将使用到的script内容显示到屏幕上,最常用的参数

七、几个重要的命令(补充,持续更新...)

  1、trap:信号处理

1 用法:trap cmd signal    #在接收到signal信号后执行cmd命令
2 范例:trap rm tmpfile INT #接收到INT信号(Ctrl+C组合键引发)后删除tmpfile

  2、find:查找文件

 1 用法:find [path] [options] [tests] [actions]
 2 功能:在 path 指定的目录下查找满足 options 和 tests 指定条件的文件,并执行 actions 指定的动作
 3     options说明:
 4     -depth          #在查看目录本身之前先搜索目录的内容
 5     -follow         #跟随符号链接
 6     -maxdepths N       #最多搜索N层目录
 7     -mount(或 -xdev)     #不搜索其他文件系统中的目录
 8
 9     tests说明:
10     -atime N        #文件在N天之前被最后访问过
11     -mtime N         #文件在N天之前被最后修改过
12     -name pattern     #文件名(不包括路径名)匹配提供的模式pattern,pattern必须用引号括起
13     -newer otherfile    #文件比otherfile更新
14     -type c         #文件类型为c,c是一个特殊类型,如d(目录)、f(普通文件)等
15     -user username     #文件的拥有者是username指定的用户
16
17     还可以使用操作符来进行组合测试
18     !       -not       #测试取反
19     -a       -and       #与运算
20     -o       -or        #或运算
21
22     actions说明:
23     -exec command        #执行一条命令,这个动作必须使用 \; 字符对来结束,常用!!!
24     -ok command         #与-exec类似,但在执行前会针对每个要处理的文件,提示用户进行确认,也必须使用 \; 字符对来结束
25     -print            #打印文件名
26     -ls              #对当前文件使用命令ls
27 说明:{}是-exec或-ok命令的一个特殊类型参数,它将被当前文件的完整路径取代
28 补充:-exec结合多个命令。-exec参数每次只能直接执行单个命令,但是我们可以把多个命令写到一个script中,然后在-exec后将单个命令替换为执行script的命令,{}将作为script的参数传递给script
29 范例:find ./ -name "*.gch" -exec rm {} \;   #在当前目录下递归查找文件名以 .gch 结尾的文件并删除他们

总结:shell的功能真的是很强大,刚开始学习就利用shell script快速地完成了很多操作,特别是用find命令来查找文件,屡试不爽啊!

时间: 2024-10-10 13:43:03

bash shell学习-shell script基础 (笔记)的相关文章

shell学习之编程基础知识

有学过编程语言的同学们都能够很快入手shell因为基础的字符类型,循环语句与C语言也差不多.以下我们来了解以下新手基础: 1.在学习循环语句之前先了解一些基础的字符信息: $0.$1.$2.$?.$*.$# $0 代表sh程序自己,例如: sh auto_system_backup.sh ,那么这里的$0就是auto_system_backup.sh Usage: { $0 /boot /etc} 这是编程中的提示信息:得到的显示结果是Usage: { auto_system_backup.sh

linux shell学习之awk ---新手笔记

1.AWK的pattern BEGIN END expression 例: NF>10 或/^a/ /regular expression/? 可以?用类似/^a/这种写法 另一种写法$1 ~ /^a/       //字段匹配 表达式之间可以?用&& || ! ?: 等操作符做布尔运算(当然可以是正则表达式) expression , expression 表?示开始和结束 例: NF==5,NF==10 例子1: cat /etc/passwd |awk -F":&qu

Java学习的一些基础笔记

classpath.;%java_home%\lib;%java_home%\lib\tools.jar;D:\Java\;java_homeD:\Program Files\Java\jdk1.8.0_51pathC:\Users\BaseKing-Sunie\AppData\Local\Code\bin;%java_home%\bin;%java_home%\jre\bin;D:\adt-bundle-windows-x86_64_20131020\sdk\tools;D:\adt-bund

Shell学习---Shell脚本的静态检查工具shellcheck

Shell脚本的静态检查工具shellcheck ubuntu下 apt install shellcheck ,即可安装shellcheck.写完shell脚本,记得用它检查一下,能给你点建议的.要检查现有项目的所有的脚本, find your_project_folder -name "*.sh" | xargs -i shellcheck {} 即可实现批量检查 原文地址:https://www.cnblogs.com/ftl1012/p/9568635.html

[Bash Shell] Shell学习笔记

1. Shell简介 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的.Shell既是一种命令语言,又是一种程序设计语言.作为命令语言,它交互式地解释和执行用户输入的命令:作为程序设计语言,它定义了各种变量和参数,并提供了许多在高级语言中才具有的控制结构,包括循环和分支. 它虽然不是Unix/Linux系统内核的一部分,但它调用了系统核心的大部分功能来执行程序.建立文件并以并行的方式协调各个程序的运行.因此,对于用户来说,s

Linux学习 -- Shell基础 -- Bash基本功能

历史命令 history -c   clear -w   写入 ~/.bash_history 默认保存1000条, 可在/etc/profile中修改 调用 Tab补全 命令.目录.文件 命令别名 alias 别名='原命令' 命令执行顺序: 绝对路径或相对路径 > 别名 > Bash的内部命令 > $PATH环境变量中找到的第一个命令(外部命令) 配置文件:/root/.bashrc 删除:unalias 别名 常用快捷键 输入输出重定向 标准输入输出 输出重定向 注意:2和>

鸟哥的Linux私房菜_基础版_学习笔记9:第十三章 学习 Shell Scripts

13.1 什么是 Shell scripts 13.1.1 干嘛学习 shell scripts 13.1.2 第一支 script 的撰写与运行 在 shell script 的撰写中还需要用到底下的注意事项: 命令的运行是从上而下.从左而右的分析与运行: 命令的下达就如同第五章内提到的: 命令.选项与参数间的多个空白都会被忽略掉: 空白行也将被忽略掉,并且 [tab] 按键所推开的空白同样视为空白键: 如果读取到一个 Enter 符号 (CR) ,就尝试开始运行该行 (或该串) 命令: 至於

Linux学习笔记——bash命令及shell变量简介

bash 及其特性 shell  外壳 GUI :Gnome  KDE  xface CLI :shell  csh  ksh  bash 程序,进程 进程:每个进程看来,当前主机上只存在内核和当前进程 进程是程序的副本,进程是程序执行实例 用户的工作环境: bash: #   root用户 $   普通用户 shell  ,子shell bash : 1.命令历史 2.管道,重定向 3.命令行编辑 4.命令别名 5.命令行展开 6.文件名通配 7.变量 8.编程 命令行使用技巧: Ctrl +

Linux Shell学习之基础篇

在学习Linux和OpenStack过程中,感觉不管是大规模部署部署还是运维,Shell脚本都已经是标配,所以学好脚本很有必要. 以下仅为Linux Shell的一些基础笔记,这里作为笔记记下. ===============linux shell简介====================== 1.命令补全:连续按两次Tab   文件或者文件夹补全:一次Tab   命令帮助:--help 2.chmod u=rwx,g+w,o+r filename   chown root.root file