重头戏终于来了!
一、Shell脚本简介
shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面, 搭配正规表示法、管线命令与数据流重导向等功能,以达到我们所想要的处理目的。
#!/bin/bash 在宣告这个 script 使用的 shell 名称。
用vi test.sh创建一个shell脚本:
#!/bin/bash
echo "Hello World !"
执行方式:
(1)bash test.sh
(2)chmod a+x test.sh;./test.sh
二、撰写 shell script 的良好习惯
在每个 script 的文件头处记录好:
- script 的功能;
- script 的版本信息;
- script 的作者与联络方式;
- script 的版权宣告方式;
- script 的 History (历史纪录);
- script 内较特殊的指令,使用『绝对路径』的方式来下达;
- script 运作时需要的环境变量预先宣告与设定。
三、简单的 shell script 练习
1、请你以 read 指令的用途,撰写一个 script ,他可以让使用者输入: 1. first name 与 2. last name, 最后并且在屏幕上显示:
『Your full name is: 』的内容。
2、随日期变化:利用 date 进行文件的建立
假设我想要建立三个空的文件 (透过 touch) ,档名最开头由使用者输入决定,假设使用者输入 filename 好了,那今天的日期是 2015/07/16 , 我想要以前天、昨天、今天的日期来建立这些文件,亦即 filename_20150714, filename_20150715, filename_20150716 ,该如何是好?
#!/bin/bash
# Program:
# Program creates three files, which named by user's input and date command.
# History:
# 2018/06/13 yue 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命令用于修改文件或者目录的时间属性,包括存取时间和更改时间。若文件不存在,系统会建立一个新的文件。
touch "${file1}" # 底下三行在建立文件
touch "${file2}"
touch "${file3}"
3、数值运算:简单的加减乘除
用户输入两个变量, 然后将两个变量的内容相乘,最后输出相乘的结果。
#!/bin/bash
# Program:
# User inputs 2 integer numbers; program will cross these two numbers.
# History:
#2018/06/13 yue First Release
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin
export PATH
echo -e "Your should inout 2 numbers.\n"
read -p "first number: " firstnu
read -p "second number: " secondnu
total=$((${firstnu}*${secondnu}))
echo -e "\nThe result is: ==>${total}"
4、数值运算:透过 bc 计算 pi
#!/bin/bash
# Program:
# User input a scale number to calculate pi number.
# History:
#2018/06/13 yue 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."
time echo "scale=${num}; 4*a(1)" | bc -lq
4*a(1) 是 bc 主动提供的一个计算 pi 的函数,至于 scale 就是要 bc 计算几个小数点下位数的意思。当 scale 的数值越大, 代表 pi 要被计算的越精确。
四、利用直接执行的方式来执行 script
不同的 script 执行方式会造成不一样的结果! 脚本的执行方式除了前面小节谈到的方式之外,还可以利用 source 或小数点 (.) 来执行。
1、利用直接执行的方式来执行 script——使用bash执行脚本时,echo script中的变量是无法显示内容的。