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在父程序中运行当

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

傻傻的心动

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值