Linux基础篇,Shell
一、基本知识
Shell Script是一种脚本。可以用来极大的简化计算机的管理。在谱写shell script的时候,需要注意以下问题:
- 1. 指令的执行是从上而下、 从左而右的分析与执行;
- 2. 指令的下达就如同第四章内提到的: 指令、 选项与参数间的多个空白都会被忽略掉;
- 3. 空白行也将被忽略掉, 并且 [tab] 按键所推开的空白同样视为空白键;
- 4. 如果读取到一个 Enter 符号 ( CR) , 就尝试开始执行该行 ( 或该串) 命令;
- 5. 至于如果一行的内容太多, 则可以使用“ [Enter] ”来延伸至下一行;
- 6. “ # ”可做为注解! 任何加在 # 后面的数据将全部被视为注解文字而被忽略!
编写好shell script后,可以通过以下方法执行程序:
- 绝对路径(注意这里的shell脚本必须具有rx的权限)
- 相对路径(注意这里的shell脚本必须具有rx的权限)
- 通过 bash shell.sh 或 sh shell.sh执行程序(注意这里的shell脚本必须具有r的权限)
二、规范与语法
1.第一个shell script
#!/bin/bash
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin
export PATH
echo "hello world!"
exit 0
注意:
(1)在shell script脚本中,#只有在 #!/bin/bash中才不起注释作用,其余的#都是注释声明
(2)export在这里是声明全部变量的意思,证明这个变量只有在这个程序及其子程序中可以使用
(3)exit 0表示退出程序,返回0,释放内存。一般约定返回0代表执行OK,返回非0代表执行出错
(4)使用exit 返回的值,在程序执行完毕之后,我们还可以使用 $? 变量获取到该值。


2.执行方式
(1)路径执行方式
这种方式执行程序后,其中的变量会直接结束。
(2)source执行方式
这种方式执行程序后,其中的变量会传给父进程。程序结束后,我们依然可以得到变量的值,例如:
源程序

变量生存周期:

3.命令间的关系
&& ===> 前一个命令执行完成后才会执行后面的命令
|| ===> 无论前一个命令是否执行成功后面的命令都会执行
$? ===> 前一个程序的返回值
三、判断式子
1.test 判断
test具有很多的判断功能,但是它并不会显示任何消息,这时候,我们需要用 && || $? 来进行逻辑思考了。test测试标记如下:
| 测试的标志 | 代表意义 |
| 一、文件夹判断 | |
| -e | 该“文件名”是否存在? ( 常用) |
| -f | 该“文件名”是否存在且为文件( file) ? ( 常用) |
| -d | 该“文件名”是否存在且为目录( directory) ? ( 常 用) |
| -b | 该“文件名”是否存在且为一个 block device 设备? |
| -c | 该“文件名”是否存在且为一个 character device 设 备? |
| -S | 该“文件名”是否存在且为一个 Socket 文件? |
| -p | 该“文件名”是否存在且为一个 FIFO ( pipe) 文件? |
| -L | 该“文件名”是否存在且为一个链接文件? |
| 二、文件判断 | |
| -r | 侦测该文件名是否存在且具有“可读”的权限? |
| -w | 侦测该文件名是否存在且具有“可写”的权限? |
| -x | 侦测该文件名是否存在且具有“可执行”的权限? |
| -u | 侦测该文件名是否存在且具有“SUID”的属性? |
| -g | 侦测该文件名是否存在且具有“SGID”的属性? |
| -k | 侦测该文件名是否存在且具有“Sticky bit”的属性? |
| -s | 侦测该文件名是否存在且为“非空白文件”? |
| 三、文件比较 | |
| -nt | ( newer than) 判断 file1 是否比 file2 新 |
| -ot | ( older than) 判断 file1 是否比 file2 旧 |
| -ef | 判断 file1 与 file2 是否为同一文件, 可用在判断 hard link 的判定上。 主要意义在判定, 两个文件是 否均指向同一个 inode 哩! |
| 四、两个整数之间的比较 | |
| -eq | 两数值相等 ( equal) |
| -ne | 两数值不等 ( not equal) |
| -gt | n1 大于 n2 ( greater than) |
| -lt | n1 小于 n2 ( less than) |
| -ge | n1 大于等于 n2 ( greater than or equal) |
| -le | n1 小于等于 n2 ( less than or equal) |
| 五、判断字符串 | |
| test -z string | 判定字串是否为 0 ? 若 string 为空字串, 则为 true |
| test -n string | 判定字串是否非为 0 ? 若 string 为空字串, 则为 false。 -n 亦可省略 |
| test str1 == str2 | 判定 str1 是否等于 str2 , 若相等, 则回传 true |
| test str1 != str2 | 判定 str1 是否不等于 str2 , 若相等, 则回传 false |
| 六、多重条件判断 |
| -o | 两状况任何一个成立! (or) |
| ! | 反相状态 (!) |
| -a | 两状况同时成立! (-and) |
eg:测试根目录下是否存在 /tmp 和 /info 文件夹
test -d /tmp && echo "存在" || echo "不存在"
test -d /info && echo "存在" || echo "不存在"
注意:
其实上面的命令等效于
(test -d /tmp && echo "存在") || echo "不存在"
(test -d /info && echo "存在") || echo "不存在"
若指定文件 存在,则test -d返回0,条件成立输出“存在”,继而屏蔽“不输出”
若指定文件不存在,则test -d返回非0,条件不成立,从而触发 || 右边的程序

2.中括号 [] 判断式
注意:
- 中括号用作判断式时,左右两边得分别有一个空格。
- 中括号内的每个组件都必须有空格键来分隔
- 中括号内的变量,最好都以双引号括起来
- 中括号内的常量最好都以单引号或双引号括起来
- 中括号的判别参数与test的参数几乎一模一样
eg:判断根目录下是否存在data文件
[ -e /data ] ; echo $?
注意:
0代表存在,非0代表不存在

3.条件判断
具体包括if then和case esac语句,使用方法见下方 五标题。
四、shell script传参
1.传参与使用参数
很多脚本都带有传参的功能,例如
service xxx [restart | stop | start]
中的restart 、stop、 start就是参数,并且传进去的参数会从 $1开始到 $2、$3......,而 $0 代表执行的脚本名。
除此之外,还有其他的一些特殊变量。具体的特殊变量如下
$# ===> 代表参数个数
$@ ===> "$1"、"$2"、"$3"..."$n" (注意,这里每个变量是独立的)
$* ===> ""$1 $2 $3...$n"" (注意这里把参数作为整体了,但是每个参数之间都有一个间隔符默认为空格)
$0 ===> 当前脚本的完整路径名
$n ===> 第n个参数(注意,n必须是一个正整数)
2.偏移参数
什么意思呢?就是每执行一次,就会删除第一个参数$1,并且把第二个参数作为新的第一个参数使用。
eg:


五、必备语句
1.if...then
该语句与C语言中的if...else if...else语句类似
if [条件判断式]; then
(工作内容)
elif [条件判断式]; then
(工作内容)
else
(工作内容)
fi
注意:
以上的 [条件判断式] 是仅判断一个条件的情况,若有多个情况需要一起判断,则有以下两种方法:
(1)每个判断式用 [] 隔开,[]与[]之间通过 && 或 || 进行逻辑判断
(2)多个判断式可以写在一个[]内,中间通过 -o 或 -a 进行逻辑判断(-o与-a是test和[]判断式的内容)
,%%%%%%%%,
,%%/\%%%%/\%%
,%%%\c "" J/%%%
%. %%%%/ o o \%%%
`%%. %%%% _ |%%%
`%% `%%%%(__Y__)%%'
// ;%%%%`\-/%%%'
(( / `%%%%%%%'
\\ .' |
\\ / \ | |
\\/ ) | |
\ /_ | |__
(___________)))))))]
eg:
if [ $1 -lt 60 ];
then echo "您的成绩不及格"
elif [ $1 -ge 60 ] && [ $1 -le 85 ];
then echo "您的成绩及格"
else
echo "您的成绩优秀"
fi

2.case...esac
该语句与C语言中的switch case语句类似
case $变量名称 in
"标志1")
(工作内容)
;;
"标志2")
(工作内容)
;;
*)
(工作内容)
exit 1
;;
esac
例如:
case $1 in
"1")
echo "您选择的是1号功能"
;;
"2")
echo "您选择的是2号功能"
;;
*)
echo "输入无效"
;;
esac

3.while do done
while [ 判断式 ]
do
(工作内容)
done
#!/bin/bash
declare -i data=10
while [ $data -ge 0 ]
do
echo $data
data=$(($data-1));
done

4.until do done
until [ 判断式 ]
do
(工作内容)
done
注意:
这里刚好与while do相反,即若满足判断式中的条件,则停止循环
eg:
#!/bin/bash
declare -i data=10
until [ $data -eq 0 ]
do
echo $data
data=$(($data-1));
done
5.for...do...done
==================================模式一====================================
for (变量) in (集合)
do
(工作内容)
done
===========================================================================
==================================模式二====================================
for (( 初始值; 限制值; 执行步长))
do
(工作内容)
done
===========================================================================
注意:
模式一适用于系统级常见任务处理,模式二适用于数值处理
eg:
#!/bin/bash
for animals in dog cat bird
do
echo ""$animals"来了"
done

#!/bin/bash
for (( i=1; i<=10; i=i+1))
do
echo $i
done

六、函数 function
定义方法:
function 函数名 () {
}
或
函数名() {
}
注意:
调用方法时,直接使用函数名即可调用,无需加括号
定义函数时function关键字可以省略
eg:
#!/bin/bash
function show () {
echo "您第 "$1" 次执行了show函数"
date
}
display () {
echo "您第 "$1" 次执行了display函数"
}
show 100
display 20
七、shell script的追踪与调试
sh [-nvx] xxx.sh
-n ===> 不要执行该脚本,仅查询语法错误
-v ===> 在执行该脚本前,先将脚本内容输出到屏幕上
-x ===> 将脚本中使用到的内容输出到屏幕上
eg:



Linux基础篇,Shell的更多相关文章
- Linux基础篇–shell脚本编程基础
本章内容概要 编程基础 脚本基本格式 变量 运算 条件测试 配置用户环境 7.1 编程基础程序:指令+数据程序编程风格: 过程式:以指令为中心,数据服务于指令 对象式:以数据为中心 ...
- Linux随笔-鸟哥Linux基础篇学习总结(全)
Linux随笔-鸟哥Linux基础篇学习总结(全) 修改Linux系统语系:LANG-en_US,如果我们想让系统默认的语系变成英文的话我们可以修改系统配置文件:/etc/sysconfig/i18n ...
- linux基础之Shell Script入门介绍
本文介绍下,学习shell script编程的入门知识,通过几个入门实例,带领大家走进shell script的神圣殿堂,呵呵,有需要的朋友参考下. 本文转自:http://www.jbxue.com ...
- 第一天 Linux基础篇
课程介绍 1.认识Linux的不同版本 2.以及应用领域 3.文件和目录 4.Linux命令概述 5.Linux命令-文件 6.Linux命令-系统管理-磁盘管理 认识Linux 什么是操作系统 生 ...
- Linux基础篇二:Bash shell(壳,命令解释器)介绍
shell执行方式: 第一:输入命令 (简单工作) 第二: 脚本 (适合大量工作) Bash shell 实际上的叫法是 GNU/Bash 如何查询呢: bash - version ...
- Linux基础(五) Shell函数
Shell 函数 linux shell 可以用户定义函数,然后在shell脚本中可以随便调用. shell中函数的定义格式如下: [ function ] funname [()] { action ...
- Linux基础之-shell script(变量,运算符,流程控制,函数)
一.shell script Shell 脚本(shell script),是一种为shell编写的脚本程序.业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell s ...
- linux基础6-bash shell编程
1. type [-ta] name 一般情况下,type命令被用于判断另外一个命令是否是内置命令,但是它实际上有更多的用法. 1.1.判断一个名字当前是否是alias.keyword.functio ...
- Linux基础篇学习——常见系统命令:ls,pwd,cd,date,hwclock,passwd,su,clear,who,w,uname,uptime,last,dmesg,free,ps,top
ls 显示指定目录中的内容 ls [OPTION]... [FILE]... OPTION -a --all,显示所有文件包括隐藏文件 -l 列出长属性,显示出文件的属性与权限等数据信息 -i 列出 ...
随机推荐
- java批量处理
最近用到Java批量处理,一次性处理多个文件夹下的多个文件,在此记录一下. 我的思路:首先要保证文件夹和文件夹下的文件的命名是有规律的,利用for循环,每次自增变量,再拼接字符串,从而得到各个文件的路 ...
- 解决vue在控制台的 NavigationDuplicated 报错
解决问题: 点击相同的链接,会有一个重复key的报错 const originalPush = Router.prototype.push Router.prototype.push = functi ...
- 通过极简模拟框架让你了解ASP.NET Core MVC框架的设计与实现[上篇]
<200行代码,7个对象--让你了解ASP.NET Core框架的本质>让很多读者对ASP.NET Core管道有了真实的了解.在过去很长一段时间中,有很多人私信给我:能否按照相同的方式分 ...
- 一起了解 .Net Foundation 项目 No.21
.Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. UWP Community ...
- JAVA EE,JAVA SE,JAVA ME,JDK,JRE,JVM之间的区别
JAVA EE是开发企业级应用,主要针对web开发有一套解决方案. JAVA SE是针对普通的桌面开发和小应用开发. JAVA ME是针对嵌入式设备开发,如手机. JRE是程序的运行环境 JDK是程序 ...
- 直径问题 Diameter Problems
2019-11-03 21:37:59 一.Diameter of Binary Tree 问题描述: 问题求解: 解法一.第一反应是树上动归,每个节点保存一下左右的最大深度,最后以每个节点作为中枢计 ...
- leetcode 每日签到 409. 最长回文串
题目: 最长回文串 给定一个包含大写字母和小写字母的字符串,找到通过这些字母构造成的最长的回文串. 在构造过程中,请注意区分大小写.比如 "Aa" 不能当做一个回文字符串. 注意: ...
- pycharm创建虚拟环境venv和添加依赖库package
1.创建虚拟环境 因为项目采用不同版本的python,所依赖的库的版本也不一样,为了避免版本冲突,为每一个项目每个python版本创建一个虚拟环境,环境中所使用的依赖库也是独立存在,不会被其他版本或其 ...
- c++实现单纯形法现行规划问题的求解
在本程序中默认该现行规划问题有最优解 针对此问题: #include<iostream> using namespace std; int check(float *sigema, int ...
- 从JSON中自动生成对应的对象模型
编程的乐趣和挑战之一,就是将体力活自动化,使效率成十倍百倍的增长. 需求 做一个项目,需要返回一个很大的 JSON 串,有很多很多很多字段,有好几层嵌套.前端同学给了一个 JSON 串,需要从这个 J ...


