IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> Linux基础学习笔记之——学习 Shell Scripts -> 正文阅读

[系统运维]Linux基础学习笔记之——学习 Shell Scripts

学习 Shell Scripts

1、第一支 script 的撰写与执行

现在我们假设你写的这个程序文件名是 /home/dmtsai/shell.sh,那么如何执行这个文件呢?

  • 直接指令下达:shell.sh 文件必须要具备可读与可执行(rx)的权限,然后:
    • 绝对路径:使用 /home/dmtsai/shell.sh 来下达指令;
    • 相对路径:假设工作目录在 /home/dmtsai,则使用 ./shell.sh 来执行;
    • 变量 “PATH” 的功能:将 shell.sh 放在 PATH 指定的目录内,例如:~/bin/
  • 以 bash 程序来执行:通过 “bash shell.sh” 或 “sh shell.sh” 来执行
#!/bin/bash
#Program:
#	This program shows "Hello World!" in your screen.
#History
#2021/09/02  Li   First release
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
export PATH
echo -e "Hello World! \a \n"
exit 0
  1. 第一行 #!/bin/bash 在宣告这个 script 使用的 shell 名称:

    因为我们使用的是 bash,所以,必须要以 “#!/bin/bash” 来宣告这个文件内的语法使用 bash 的语法。那么当这个程序被执行时,他就能加载 bash 的相关环境配置文件(一般来说就是 non-login shell 的 ~/.bashrc)并且执行 bash 来使我们底下的指令能够执行。

  2. 程序内容说明

    建议添加说明:1、内容与功能;2、版本信息;3、作者与联系方式;4、文件日期;5、历史记录。

  3. 主要环境的宣告

    PATH

  4. 主要程序部分

  5. 执行结果告知(定义回传值)

[root@MiWiFi-R4A-srv ~]# sh hello.sh
Hello World!

2、简单的 shell script 练习

2.1、简单范例

2.1.1、对谈式脚本:变量内容由用户决定

#!/bin/bash
#Program:
#	User inputs his first name and last name. Program shows his full name.
#History
#2021/09/02  Li   First release
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

read -p "Please input your first name:" firstname
read -p "Please input your last name:" lastname
echo -e "\n Your full name is: ${firstname} ${lastname}"

2.1.2、随日期变化:利用 date 进行文件的建立

#!/bin/bash
#Program:
#	Program creates three files, which named by user's input and date command.
#History
#2021/09/02  Li   First release
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

#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)"

2.1.3、数值运算:简单的加减乘除

#!/bin/bash
#Program:
#	User inputs 2 integer numbers; program will cross these two numbers.
#History
#2021/09/02  Li   First release
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

echo -e "You Should input 2 numbers, I will multiplying them! \n"
read -p "first number: " firstnu
read -p "second number: " secondnu
total=$((${first}*${secondnu}))
echo -e "\n The result of ${firstnu} * ${secondnu} is ==> ${total}"

2.1.4、通过 bc 计算 pi

#!/bin/bash
#Program:
#	User inputs a scale number to calculate pi number.
#History
#2021/09/02  Li   First release
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

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 patien."
time echo "scale=${num}; 4*a(1)" | bc -lp

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

2.2.1、利用直接执行的方式来执行 script

不论是直接指令下达,或者是利用 bash 来下达指令,该 script 都会使用一个新的 bash 环境来执行脚本内的指令!重点在于:当子程序完成后,在子程序内的各项变量或动作将会结束而不会传到父程序中!

如果使用 Windows 编辑的脚本,请使用:

sed -i ‘s/\r//’ 脚本名
[root@MiWiFi-R4A-srv bash]# echo ${firstname} ${lastname}
		<== 确认了,这两个变量并不存在!
[root@MiWiFi-R4A-srv bash]# sh showname.sh
Please input your first name:VBird
Please input your last name:Tsai

 Your full name is: VBird Tsai
[root@MiWiFi-R4A-srv bash]# echo ${firstname} ${lastname}
		<== 事实上,这两个变量在父程序中的 bash 中还是不存在
		

[root@MiWiFi-R4A-srv bash]# chmod 744 showname.sh
[root@MiWiFi-R4A-srv bash]# ./showname.sh
Please input your first name:VBird
Please input your last name:Tsai

 Your full name is: VBird Tsai
[root@MiWiFi-R4A-srv bash]# echo ${firstname} ${lastname}
		<== 同样这两个变量在父程序中的 bash 中还是不存在

2.2.2、利用 source 来执行脚本:在父程序中执行

[root@MiWiFi-R4A-srv bash]# source showname.sh
Please input your first name:VBird
Please input your last name:Tsai

 Your full name is: VBird Tsai
[root@MiWiFi-R4A-srv bash]# echo ${firstname} ${lastname}
VBird Tsai

3、善用判断式

3.1、利用 test 指令的测试功能

[root@MiWiFi-R4A-srv bash]# test  -e /li

执行结果并不会显示任何信息,但最后我们可以通过 $? 或 && 及 || 来展示整个结果!

[root@MiWiFi-R4A-srv bash]# test  -e /li && echo "exist" || echo "Not Exist"
Not Exist
[root@MiWiFi-R4A-srv bash]# test  -e /home/li && echo "exist" || echo "Not Exist"
exist
测试的标志代表意义
1.关于某个文件名的 “文件类型” 判断
-e该 “文件名” 是否存在?
-f该 “文件名” 是否存在且为文件(file)?
-d该 “文件名” 是否存在且为目录(directory)?
-b该 “文件名” 是否存在且为一个 block device 设备?
-c该 “文件名” 是否存在且为 character device 设备?
-S该 “文件名” 是否存在且为 Socket 文件?
-p该 “文件名” 是否存在且为一个 FIFO(pipe)文件?
-L该 “文件名” 是否存在且为一个连结文件?
2.关于文件的权限侦测
-r侦测该文件名是否存在且具有 “可读” 的权限?
-w侦测该文件名是否存在且具有 “可写” 的权限?
-x侦测该文件名是否存在且具有 “可执行” 的权限?
-u侦测该文件名是否存在且具有 “SUID” 的权限?
-g侦测该文件名是否存在且具有 “SGID” 的权限?
-k侦测该文件名是否存在且具有 “sticky bit” 的权限?
-s侦测该文件名是否存在且为 “非空白文件”?
3.两个文件的比较
-nt(newer than)判断 file1 是否比 file2 新
-ot(older than)判断 file1 是否比 file2 旧
-ef判断 file1 与 file2 是否为同一个文件,可用在判断 hard link 上。主要意义在于判断两个文件是否均指向同一个 inode
4.关于两个整数之间的判定
-eq两数值相等(equal)
-ne两数值不等(not equal)
-gtn1 大于 n2(greater than)
-ltn1 小于 n2(less than)
-gen1 大于等于 n2(greater than or equal)
-len1 小于等于 n2(less than or equal)
5.判定字符串的数据
test -z string判定字符串是否为 0?若 string 为空字符串,则为 true
test -n string判定字符串是否非为 0?若 string 为空字符串,则为 false
test str1 == str2判定 str1 是否等于 str2,若相等,则返回 true
test str1 != str2判定 str1 是否不等于 str2,若相等,则返回 false
6.多重条件判定
-a(and)两情况同时成立!
-o(or)两情况任何一个成立!
!反相情况
#!/bin/bash
#Program:
#	User input a filename, program will check the following:
#	1).exist?2).file/directory?3).file permissions.
#History
#2021/09/05  Li   First release
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin

#1. 让使用者输入文件名,并且判断使用者是否真的有输入字符串?
echo -e "Please input a filename, I will check the filename's type and permission. \n\n"
read -p "Input a  filename : " filename
test -z ${filename} && echo "You must input a filename." && exit 0

#2. 判断文件是否存在?若不存在则显示信息并结束脚本
test ! -e ${filename} && echo "The filename '${filename}' DO NOT exist" && exit 0

#3. 开始判断文件类型与属性
test -f ${filename} && filetype="regular file"
test -d ${filename} && filetype="directory"
test -r ${filename} && perm="readable"
test -w ${filename} && perm="${perm} writable"
test -x ${filename} && perm="${perm} executable"

#4. 开始输出信息
echo "The filename: ${filename} is a ${filetype}"
echo "And the permission for you are : ${perm}"
[root@MiWiFi-R4A-srv bash]# sed -i 's/\r//g' file_perm.sh
[root@MiWiFi-R4A-srv bash]# bash file_perm.sh
Please input a filename, I will check the filename's type and permission.


Input a  filename : hello.sh
The filename: hello.sh is a regular file
And the permission for you are : readable writable
  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-09-06 11:30:56  更:2021-09-06 11:33:07 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 13:36:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码