首页 > 系统相关 >Linux学习笔记(9)——学习Shell脚本

Linux学习笔记(9)——学习Shell脚本

时间:2022-11-10 10:13:13浏览次数:45  
标签:bin 脚本 sbin shell echo 学习 Shell usr Linux

学习shell脚本

一、什么是shell脚本

shell脚本是利用shell的功能所写的一个【程序(program)】。这个程序是使用纯文本文件,将一些shell的语法与命令(含外部命令)写在里面,搭配正则表达式、管道命令与数据流重定向等功能,以达到我们想要的处理目的。

1.1 为什么要学习shell脚本

  • 自动化管理的重要根据
  • 跟踪与管理系统的重要工作
  • 简单入侵检测功能
  • 连续命令单一化
  • 简易的数据处理
  • 跨平台支持与学习历程较短

1.2 第一个脚本的编写与执行

直接命令执行:shell.sh必须要有可读与可执行(rx)的权限:

  • 绝对路径
  • 相对路径
  • 变量【PATH】
  • bash程序:【bash shell.sh】 或 【sh shell.sh】
#!/bin/bash
PATH=/usr/local/bin:/bin:/usr/bin:/usr/local/sbin:/usr/sbin:/home/admin/.loc    al/bin:/home/admin/bin
export PATH
echo -e "Hello World! \a \n"
exit 0

1.3 建立shell脚本的良好编写习惯

文件头处记录好:

  1. 脚本的功能
  2. 版本信息
  3. 作者与联络方式
  4. 版权声明方式
  5. History(历史记录)
  6. 脚本内较特殊的命令,使用【绝对路径】的方式执行
  7. 脚本运行时需要的环境变量预先声明与设置

二、简单的shell脚本

2.1 简单范例

  • 交互式脚本:变量内容由用户决定

    #!/bin/bash
    #Program:
    #	User inputs his first name and last name. Program shows his full name.
    #History:
    #2015/07/16	Sino	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    read -p "Please input your first name: " firstname	# 提示使用者输入
    read -p "Please input your last name: "  lastname	# 提示使用者输入
    echo -e "\nYour full name is: ${firstname} ${lastname}"	# 结果由屏幕输出
    
  • 随日期变化:利用date建立文件

    #!/bin/bash
    #Program:
    #	Program creates three files, which named by user's input and    date command.
    #History:
    #2022/11/10	Sino	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/    bin
    export PATH
    # 1. 让使用者输入文件名称,并取得fileuser这个变量
    echo -e "I will use 'touch'command to create 3 files."
    read -p "Please input your filename: " fileuser
    # 2. 为了避免使用者随意按Enter,利用变量功能分析文件名是否有设置?
    filename=${fileuser:-"filename"}
    # 3. 开始利用date命令来取得所需要的文件名了
    date1=$(date --date='2 days ago' +%Y%m%d)
    date2=$(date --date='1 days ago' +%Y%m%d)
    date3=$(date +%Y%m%d)
    file1=${filename}${date1}
    file2=${filename}${date2}
    file3=${filename}${date3}
    # 4. 将文件名建立
    touch "${file1}"
    touch "${file2}"
    touch "${file3}"
    
  • 数值运算:简单的加减乘除

    #!/bin/bash
    #Program:
    #	User inputs 2 integer numbers; program will cross these two     numbers.
    #History:
    #2022/11/10	Sino	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/    bin
    export PATH
    echo -e "You SHOULD input 2 numbers, I will multiplying them! \n"
    read -p "first number:  " firstnu
    read -p "second number: " secnu
    total=$((${firstnu}*${secnu}))
    echo -e "\nThe result of ${firstnu} x ${secnu} ==> ${total}"
    
  • 数值运算:通过bc计算Pi(圆周率)

    #!/bin/bash
    #Program:
    #	User input a scale number to calculate pi number.
    #History:
    #2022/11/10	Sino	First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    echo -e "This program will calculate pi value. \n"
    echo -e "You should input a float number to calculate pi value.\n"
    read -p "The scale number (10~10000) ? " checking
    num=${checking:-"10"}   # 开始判断是否有输入数值
    echo -e "Starting calculate pi value. Be patient."
    time echo "scale=${num}; 4*a(1)" | bc -lq
    

2.2 脚本的执行方式差异(source、sh script、./script)

  • 利用直接执行的方式来执行脚本
    • 当子进程完成后,在子进程内的各项变量或操作将会结束而不会传回到父进程中
  • 利用source来执行脚本:在父进程中执行

三、善用判断式

3.1 利用test命令的测试功能

[admin@localhost bin]$ test -e /dmtsai
[admin@localhost bin]$ test -e /dmtsai && echo "exist" || echo "Not exist"
Not exist

3.2 利用判断符号[]

利用判断符号来进行数据的判断

[admin@localhost bin]$ [ -z "${HOME}" ] ; echo $?
1
  • 在中括号[]内的每个组件都需要有空格来分隔
  • 在中括号的变量,最好都以双引号括号起来
  • 在中括号内的常数,最好都以单或双引号括号起来

3.3 shell脚本的默认变量($0、$1...)

  • $#:代表后接的参数【个数】
  • $@:代表【"$1""$2""$3""$4"】之意,每个变量是独立的
  • $*:代表【"$1c$2c$3c$4"】,其中c为分隔字符,默认为空格
#!/bin/bash
#Program:
#	Program show the scriptnamae, parameters...
#History:
#2022/11/10	Sino	First release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo "The script name is	==> ${0}"
echo "Total parameter number is	==> $#"
[ "$#" -lt 2 ] && echo "The number of parameter is less than 2. Stop here." && exit 0
echo "Your whole parameter is	==> '$@'"
echo "The 1st parameter		==> ${1}"
echo "The 2nd parameter		==> ${2}"
[admin@localhost bin]$ sh how_paras.sh theone haha quot
The script name is	==> how_paras.sh
Total parameter number is	==> 3
Your whole parameter is	==> 'theone haha quot'
The 1st parameter		==> theone
The 2nd parameter		==> haha

四、条件判断式

4.1 利用if...then

4.2 利用case...esac判断

4.3 利用function功能

五、循环

5.1 while do done、until do done(不定循环)

5.2 for...do...done(固定循环)

5.3 for...do...done的数值处理

六、shell脚本的跟踪与调试

sh [-nvx] scripts.sh
选项与参数:
-n  :不要执行脚本,仅查询语法的问题
-v  :执行脚本前,将脚本文件的内容输出到屏幕上
-x  :将使用到的脚本内容显示到屏幕上,这是很有用的参数

标签:bin,脚本,sbin,shell,echo,学习,Shell,usr,Linux
From: https://www.cnblogs.com/I-am-Sino/p/16876151.html

相关文章

  • 皕杰报表的Linux部署
    对于一个新的linux系统,在上面部署皕杰报表需要下面的步骤: 1.首先得配置java环境变量,因为皕杰报表是纯java的,所以环境变量必不可少。2.然后把linux版的tomcat放到Linux系统......
  • 基于TensorFlow和Python的机器学习(笔记3)
    基于TensorFlow和Python的机器学习(笔记3)          embedding的原理是使用矩阵乘法来进行降维,从而达到节约存储空间的目的。word2vector工作流程图......
  • 在PetaLinux工程中调试关键模块代码
    在PetaLinux工程中,与单板相关的UBoot、Linux等模块,经常需要编辑、调试。在旧版本中,可以为UBoot、Linux选择“ext-local-src”,指定UBoot、Linux的代码,从而使PetaLinux使......
  • 20201317-Linux-Thread 互斥测试
    #include<stdio.h>#include<stdlib.h>#include<pthread.h>//linux线程库#include<ctype.h>//测试和映射字符的库structarg_set{ char*fname; int......
  • 【高中数学】三角函数、解三角形学习笔记
    1三角函数的定义1.1三角函数在平面直角坐标系中,角\(\alpha\)的终边和单位圆交于点\(P\),显然对于任意一个\(\alpha\in\text{R}\),$P(x,y)$是唯一确定的,故\(P(x,......
  • Windows路径或者Linux路径映射成web路径进行访问代码
    packagecom.soft.mpms.zframe.config;importjava.io.File;importorg.springframework.context.annotation.Configuration;importorg.springframework.web.servlet.c......
  • 【学习笔记】扫描线
    备战NOIP2022填坑ing...扫描线思想就是把横边从小到大sort,拿条线从下往上扫,扫到横边算一下长度,再乘上两条横边的高度差,因为要求\(O(nlogn)\)的时间复杂度所以用线段......
  • 新的学习历程-python2 print
    1print('helloworld!')2print('hello','world!')#逗号自动添加默认的分隔符:空格3print('hello'+'world!')#加号表示字符拼接4print('hello','world',sep='***')......
  • JUC学习笔记——进程与线程
    JUC学习笔记——进程与线程在本系列内容中我们会对JUC做一个系统的学习,本片将会介绍JUC的进程与线程部分我们会分为以下几部分进行介绍:进程与线程并发与并行同步与异......
  • Mysq学习(字符串类型、日期类型)
    一、字符串类型的基本使用其细节utf8编码格式:三个字节表示一个字符;ctf8varchar(size)size=(65535-3)/3=21844;gbk编码格式:两个字节表示一个字符;gbkvarchar(size)si......