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 列出 ...
随机推荐
- 【5min+】 一个令牌走天下!.Net Core中的ChangeToken
系列介绍 [五分钟的dotnet]是一个利用您的碎片化时间来学习和丰富.net知识的博文系列.它所包含了.net体系中可能会涉及到的方方面面,比如C#的小细节,AspnetCore,微服务中的.net ...
- 题解 NOIP2018【赛道修建】—— 洛谷
这道题有一点点树上dp的意思(大佬轻喷 我刚拿到这道题的时候毫无头绪,只知道这道题要二分答案 为什么是二分答案??? 题目: 目前赛道修建的方案尚未确定.你的任务是设计一 种赛道修建的方案,使得修建的 ...
- emgucv 提示缺少emgucv.word
遇到这种问题真的挺恶心的 ,因为条件不同触发这种错误条件也不一样,但是主要原因就是一个那就是你的程序找不到dll了(废话...) 1.首先检查Redistributable 与runtime(在开发环 ...
- seldom之数据驱动
seldom之数据驱动 如果自动化某个功能,测试数据不一样而操作步骤是一样的,那么就可以使用参数化来节省测试代码. seldom是我在维护一个Web UI自动化测试框,这里跟大家分享seldom参数化 ...
- 基于Jquery WeUI的微信开发H5页面控件的经验总结(2)
在微信开发H5页面的时候,往往借助于WeUI或者Jquery WeUI等基础上进行界面效果的开发,由于本人喜欢在Asp.net的Web界面上使用JQuery,因此比较倾向于使用 jQuery WeUI ...
- JSP+Servlet+JDBC+Mysql实现的天才会议管理系统
本文存在视频版本,请知悉 项目简介 项目来源于:https://github.com/hegexunmeng/meeting-system 这次分享一个会议管理系统,前端后端几乎没有使用任何框架,适合 ...
- Remmina
什么是Remmina? Remmina作为一个远程连接服务器,可以方便快捷的帮你连接服务器,不用直接使用命令行的方式去连接服务器,使用也很简单.具体下载直接在APP中下载就好,Linux自带这个软件, ...
- 《HelloGitHub》第 48 期
兴趣是最好的老师,HelloGitHub 就是帮你找到兴趣! 简介 分享 GitHub 上有趣.入门级的开源项目. 这是一个面向编程新手.热爱编程.对开源社区感兴趣 人群的月刊,月刊的内容包括:各种编 ...
- linux入门系列20--Web服务之LNMP架构实战
作为本入门系列最后一篇文章,将演示如何在CentOS7环境下搭建LNMP环境来构建个人博客网站. 常见搭建网站的方式有LAMP.LNMP.IIS.Nginx.Tomcat等等,本文演示比较流行的基于L ...
- 粒子群优化算法(PSO)之基于离散化的特征选择(FS)(四)
作者:Geppetto 前面我们介绍了特征选择(Feature Selection,FS)与离散化数据的重要性,介绍了PSO在FS中的重要性和一些常用的方法.FS与离散化的背景,介绍了EPSO与PPS ...


