• Linux 系统vim练习简单的 shell script


    1.完成简单范例
        1.1对话式脚本:变量内容由使用者决定
        很多时候我们需要使用者输入一些内容,好让程序可以顺利运行。
       要求:使用read命令撰写一个script。让用户输入first name 与 last name后,在屏幕上显示“Your full name is:”的内容:
    [root@CentOS7-1 scripts]# vim sh02.sh
    #!/bin/bash
    # Program:
    #User inputs his first name and last name.
    # History:
    # 2022/11/6  Devil  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"  #结果由屏幕输出

    [root@CentOS7-1 scripts]# sh sh02.sh

       1.2随日期变化:利用date 进行文件的创建
       假设服务器内有数据库,数据库每天的数据都不一样,当备份数据库时,希望将每天的数据都备份成不同的文件名,这样才能让旧的数据也保存下来而不被覆盖。怎么办?
      考虑到每天的“日期”并不相同,可以将文件名取成类似:backup.2022-11-6.data,不就可以每天一个不同文件名了吗?确实如此。那么2022-11-6是怎么来的呢?
      看下面的例子:假设想要创建3个空的文件(通过touch),文件名开头由用户输入决定假设用户输入“filename”,而今天的日期是2022-11-3,若想要以前天、昨天、今天的日期来创建这些文件,即 filename_20221101,filename_20221102,filename_20221103,该如何编写程序?
    [root@CentOS7-1 scripts]# vim sh03.sh
    #!/bin/bash

    # Program:
    #Program creates three files, which named by user's input and date command.
    # History:
    # 2018/11/3  Devil  First release
    PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
    export PATH
    #让使用者输入文件名称,并取得fileuser这个变量
    echo -e "I will use 'touch' command to create 3 files.”#纯粹显示信息
    read -P "Please input your filename:" fileuser    #提升用户输入文件名称
    #为了避免用户随意按“Enter”键,利用变量功能分析文件名是否设置?
    filename=${fileuser:-"filename"}
    # 开始判断是否设置了文件名。如果在上面输入文件名时直接按下了 Enter键,那么fileuser值为空,这时系统会将“filename”赋给变量filename,否则将 fileuser 的值赋给变量 filename

    #开始利用date命令来取得所需要的文件名
    datel=$(date --date='2 days ago' +%Y%m%d)  #前两天的目期,注意+号前面有个空格
    date2=$(date --date='l days ago' +%Y%m%d) #前一天的日期,注意+号前面有个空格
    date3=$(date +%Y%m%d)                        #今天的日期
    file1=${filename}${date1}                    #这三行设置文件名

    file2=${filename}${date2}

    file2=${filename}${date3}

    #创建文件
    touch "$filel"

    touch "$file2"

    touch "$file3"
    [root@CentOS7-1 scripts]# sh sh03.sh
    [root@CentOS7-1 scripts]# ll
       分两种情况运行 sh03.sh:一次直接按“Enter”键来查阅文件名是什么,另一次可以输入-些字符,这样可以判断脚本是否设计正确。
       1.3数值运算:简单的加减乘除
       可以使用declare 来定义变量的类型,利用“$((计算式))”来进行数值运算。不过可惜的是,bash shell系统默认仅支持到整数。下面的例子要求用户输入两个变量,然后将两个变量的内容相乘,最后输出相乘的结果。
    [root@CentOS7-1 scripts]# vim sh04.sh
    #!/bin/bash
    # Program:
    #User inputs 2 integer numbers; program will cross these two numbers.
    # History:
    # 2022/11/4  Devil  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 cross them! \n"
    read -p "first number: " firstnu
    read -p "second number: " secnu
    total=$(($firstnu*$secnu))
    echo -e "\nThe result of $firstnu $secnu is ==> $total"
    [root@CentOS7-1 scripts]# sh sh04.sh
       在数值的运算上,可以使用“declare-itotal=$firstnu*$secnu”,也可以使用上面的方式来表示。建议使用下面的方式进行运算:
    var=S((运算内容))
       不但容易记忆,而且也比较方便。因为两个小括号内可以加上空白字符。至于数值运算上的处理,则有+、-、*、/、%等,其中%是取余数。
    [root@CentOS7-1 scripts]# echo $((13 %3))
    1
       2.了解脚本的运行方式的差异
       不同的脚本运行方式会造成不一样的结果,尤其对bash的环境影响很大。脚本的运行方式除了前面小节谈到的方式之外,还可以利用source 或小数点(.)来运行。那么这些运行方式有何不同呢?
       2.1利用直接运行的方式来运行脚本
       当使用前一小节提到的直接命令(不论是绝对路径/相对路径还是 $PATH内的路径),或者是利用bash(或 sh)来执行脚本时,该脚本都会使用一个新的bash环境来运行脚本内的命令。也就是说,使用这种执行方式时,其实脚本是在子程序的bash内运行的,并且当子程序完成后,在子程序内的各项变量或动作将会结束而不会传回到父程序中。这是什么意思呢?
       我们以刚刚提到过的 sh02.sh这个脚本来说明。这个脚本可以让使用者自行配置两个变量,分别是firstname与 lastname。想一想,如果直接运行该命令时,该命令配置的firstmame会不会生效?看一下下面的运行结果:
    [root@CentOS7-1 scripts]# echo $firstname $lastname<==首先确认变量并不存在
    [root@CentOS7-1 scripts]# sh sh02.sh
    Please input your first name: Devil
    Please input your last name:Fang    <==这个名字是读者自己输入的
    Your full name is: Devil Fang   <==看吧!在脚本运行中,这两个变量会生效
    [root@CentOS7-1 scripts]#echo $firstname $lastname 
                        <==事实上,这两个变量在父程序的bash中还是不存在

    从上面的结果可以看出,sh02.sh配置好的变量竟然在bash环境下面无效。怎么回事呢?这里用图1来说明。当你使用直接运行的方法来处理时,系统会开辟一个新的 bash 来运行 sh02.sh里面的命令。因此 firstname、lastname等变量其实是在图1中的子程序bash内运行的。

     图1 sh02.sh 在子程序中运行

      sh02.sh运行完毕,子程序bash内的所有数据便被移除,因此上面的练习中,在父程序下面执行 echo $firstname时,就看不到任何东西了。
       2.2利用source运行脚本:在父程序中运行
       如果使用source来运行命令,那会出现什么情况呢?请看下面的运行结果:
    [root@CentOS7-1 scripts]# source sh02.sh
    Please input your first name:Devil  <==这个名字是读者自己输人的
    Please input your last name: Fang
    Your full name is: Devil Fang    <==在script运行中,这两个变量会生效
    [root@CentOS7-1 scripts]# echo $firstname $lastname
    Devil Fang                           <==有数据产生
       变量竟然生效了,为什么呢?因为source对script的运行方式可以使用下面的图2来说明。sh02.sh会在父程序中运行,因此各项操作都会在原来的bash内生效。这也是为什么当你不注销系统而要让某些写人~/.bashrc的设置生效时,需要使用“source ~/.bashrc”而不能使用“bash ~/.bashrc”的原因。

    图2 sh02.sh在父程序中运行当

     

  • 相关阅读:
    安装这个IIS-Applicationlnit
    Temu、Shopee、Lazada等跨境电商流量如何提升?买家号如何批量养号?
    mysql基础知识(四) 聚合函数
    使用C#监控选定文件夹中文件的变动情况
    84.(cesium之家)cesium模型在地形上运动
    程序的编译和链接
    Zynq UltraScale+ XCZU9EG 纯VHDL解码 IMX214 MIPI 视频,2路视频拼接输出,提供vivado工程源码和技术支持
    探秘高逼格艺术二维码的制作过程-AI绘画文生图
    TP6首页加载报错 Call to a member function run() on null
    【vue3源码】二、vue3的响应系统分析
  • 原文地址:https://blog.csdn.net/m0_63624418/article/details/127714785