shell脚本初学者笔记
概述
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Shell 脚本(shell script),是一种为 shell 编写的脚本程序。
Linux 的 Shell 种类众多,其中Bourne Again Shell(Bash),由于易用和免费,在日常工作中被广泛使用,同时也是大多数Linux 系统默认的 Shell。
基础
#!/bin/bash #! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。
新建一个文件*.sh,扩展名为 sh(sh代表shell),扩展名并不影响脚本执行,见名知意就好。
查看当前系统中可以shell程序:cat /etc/shells
查看当前系统中Shell程序的pid:$$
查看当前系统中Shell程序:$SHELL
运行 Shell 脚本有两种方法:1、chmod +x ./test.sh ./test.sh 2、/bin/bash test.sh
变量
定义变量:YOURPATH=””, 变量名和等号之间不能有空格
使用变量:$ YOURPATH 或 ${YOURPATH}
变量名外面的花括号是可选的,加花括号是为了帮助解释器识别变量的边界。
推荐给所有变量加上花括号,这是个好的编程习惯。
使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。
如:myUrl=http://www.google.com readonly myUrl
使用 unset 命令可以删除变量,变量被删除后不能再次使用。
unset 命令不能删除只读变量。
运行shell时,会同时存在三种变量:1) 局部变量 2) 环境变量 3) shell变量
获取变量字符串长度:string="abcd" echo ${#string} #输出 4
提取子字符串:string="runoob" echo ${string:1:4} #输出 unoo
定义数组:array_name=(value0 value1 value2 value3)
读取数组:valuen=${array_name[n]}
获取数组的长度:length=${#array_name[@或*]}
反引号[`]用于命令替换,如`pwd`将pwd命令的输出展开使用
包含外部脚本:. 空格 *.sh
以 # 开头的行就是注释,会被解释器忽略。
多行注释还可以使用以下格式:
:<<EOF EOF
:<<' '
:<<! !
Shell 传递参数
$n。n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……
$# 传递到脚本的参数个数
$* 以一个单字符串显示所有向脚本传递的参数。如"$*"用「"」括起来的情况、以"$1 $2 … $n"的形式输出所有参数。
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同,但是使用时加引号,并在引号中返回每个参数。如"$@"用「"」括起来的情况、以"$1" "$2" … "$n" 的形式输出所有参数。
$- 显示Shell使用的当前选项,与set命令功能相同。
$? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
各种运算符
Shell 和其他编程语言一样,支持多种运算符,包括:算数运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符。
原生bash不支持简单的数学运算,但是可以通过其他命令来实现,例如 awk 和 expr,expr 最常用。
expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
val=`expr 2 + 2`
echo "两数之和为 : $val"
-eq 检测两个数是否相等,相等返回 true。
-ne 检测两个数是否不相等,不相等返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回
true。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。
! 非运算,表达式为 true 则返回 false,否则返回 true。
-o 或运算,有一个表达式为 true 则返回 true。
-a 与运算,两个表达式都为 true 才返回 true。
&& 逻辑的 AND
|| 逻辑的 OR
= 检测两个字符串是否相等,相等返回
true。
!= 检测两个字符串是否相等,不相等返回
true。
-z 检测字符串长度是否为0,为0返回 true。
-n 检测字符串长度是否为0,不为0返回 true。
$ 检测字符串是否为空,不为空返回
true。
-b file 检测文件是否是块设备文件,如果是,则返回 true。
-c file 检测文件是否是字符设备文件,如果是,则返回 true。
-d file 检测文件是否是目录,如果是,则返回
true。
-f file 检测文件是否是普通文件(不是目录,也不是设备文件),Yes,则返回 true。 -g file 检测文件是否设置了 SGID 位,如果是,则返回 true。
-k file 检测文件是否设置了粘着位(Sticky
Bit),如果是,则返回 true。
-p file 检测文件是否是有名管道,如果是,则返回
true。
-u file 检测文件是否设置了 SUID 位,如果是,则返回 true。
-r file 检测文件是否可读,如果是,则返回
true。
-w file 检测文件是否可写,如果是,则返回
true。
-x file 检测文件是否可执行,如果是,则返回
true。
-s file 检测文件是否为空(文件大小是否大于0),不为空返回 true。
-e file 检测文件(包括目录)是否存在,如果是,则返回 true。
输出
Shell 的 echo 指令常用,都是用于字符串的输出。
echo "It is
a test"
echo
"\"It is a test\""
echo "$name
It is a test"
echo -e
"OK! \n" #
-e 开启转义
echo -e
"OK! \c" #
-e 开启转义 \c 不换行
echo "It is
a test" > myfile # 显示结果定向至文件
echo `date` # 显示命令执行结果
printf 命令模仿 C 程序库(library)里的
printf() 程序。
printf 由 POSIX 标准所定义,因此使用 printf 的脚本比使用 echo 移植性好。
printf
"%-10s %-8s %-4s\n" 姓名 性别 体重kg
printf
"%-10s %-8s %-4.2f\n" 郭靖 男 66.1234
printf
"%-10s %-8s %-4.2f\n" 杨过 男 48.6543
printf
"%-10s %-8s %-4.2f\n" 郭芙 女 47.9876
流程控制
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
while condition
do
command
done
until condition
do
command
done
case 值 in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
Esac
可以使用break跳出循环,使用continue继续下一次循环
函数
linux shell 可以用户定义函数,然后在shell脚本中可以随便调用。
demoFun(){
echo "这是我的第一个
shell 函数!"
}
echo "-----函数开始执行-----"
demoFun
echo "-----函数执行完毕-----"
funWithParam(){
echo "第一个参数为
$1 !"
echo "第二个参数为
$2 !"
echo "第十个参数为
$10 !"
echo "第十个参数为
${10} !"
echo "第十一个参数为
${11} !"
echo "参数总数有 $#
个!"
echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2
3 4 5 6 7 8 9 34 73
重定向
大多数 UNIX 系统命令从你的终端接受输入并将所产生的输出发送回到您的终端。一个命令通常从一个叫标准输入的地方读取输入,默认情况下,这恰好是你的终端。同样,一个命令通常将其输出写入到标准输出,默认情况下,这也是你的终端。
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。
如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以将输出重定向到 /dev/null
/dev/null 是一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。
总结
Shell脚本需要多多实战练习,可以实现众多复杂的功能,提高办事效率。
参考
https://www.runoob.com/linux/linux-shell.html
shell脚本初学者笔记的更多相关文章
- shell 脚本实战笔记(10)--spark集群脚本片段念念碎
前言: 通过对spark集群脚本的研读, 对一些重要的shell脚本技巧, 做下笔记. *). 取当前脚本的目录 sbin=`dirname "$0"` sbin=`cd &quo ...
- shell脚本编写笔记
包含转载内容,转载自http://wenku.baidu.com/link?url=jtCHxEYzgGve6P64U3JRQRgU6nhpGvqFLLpWu9I2Htq6hi9TGLudRFkk7r ...
- Shell 脚本编程笔记(一) Hello Shell
最近不断在接触Linux操作系统,对它一个终端走天下的特性感到十分新奇和伟大.同时也被各种命令折磨的死去活来...公司的一个老同事给我讲,在公司的极品geek宅都是只用一个黑黑的框完成一切的.结果我一 ...
- shell脚本学习笔记(符号)
shell脚本的学习: 1.Shell的作用是解释运行用户的命令,用户输入一条命令,Shell就解释运行一条,这样的方式称为交互式(Interactive),Shell还有 一种运行命令的方式称为批处 ...
- linux shell脚本编程笔记(二): 分支结构
1.if if command then commands fi if command then commands else commands fi if command1 then command ...
- shell脚本学习笔记 (流编辑器sed)
sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用很普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出. sed不 ...
- shell脚本入门笔记
转载:http://mp.weixin.qq.com/s?__biz=MzA3MTIxNzkyNg==&mid=204081791&idx=1&sn=27bb1d827e0f8 ...
- shell脚本自学笔记
一. 什么是Shell脚本 shell脚本并不能作为正式的编程语言,因为它是在linux的shell中运行的,所以称为shell脚本.事实上,shell脚本就是一些命令的集合. 假如完成某个需求需要一 ...
- Shell脚本学习笔记之(自动填充函数模板)
其实,vii 就是写的一个脚本,跟 vi 没半毛钱关系,只不过借用一下这个名字而已.那这个脚本长什么样呢?look: 下面来详细的解析上面的代码,来看第1行: #!/bin/bash 这是Shell脚 ...
随机推荐
- 唐敬博-201871010118 《面向对象程序设计(java)》第七周学习总结
在博客园撰写博客(随笔),总结7周实验内容,作业格式要求如下: 博文名称:学号-姓名<面向对象程序设计(java)>第七周学习总结(1分) 博文正文开头格式:(2分) 项目 内容 这个作业 ...
- HTML与CSS学习笔记(3)
1.float浮动 脱离文档流:沿着父容器靠左或者靠右进行排列 文档流 文档流是文档可显示对象在排列时所占用的位置 float特性 left.right.none float注意点: 只会影响后面的元 ...
- pikachu的xss及csrf
一.XSS 可解析的js 未经过滤 XSS见框就插 script 大小写 中间插入 <img src="" onerror="alert(11111)&q ...
- pom.xml文件说明(八)
<?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://mave ...
- 每天一道Rust-LeetCode(2019-06-04)
每天一道Rust-LeetCode(2019-06-04) 最长回文子串 坚持每天一道题,刷题学习Rust. 原题 题目描述 给定一个字符串 s,找到 s 中最长的回文子串.你可以假设 s 的最大长度 ...
- 配置好运行后Error creating context 'spring.root': Could not load type from string value
在Webconfig文件的当前项目下引用相关项目
- ESA2GJK1DH1K升级篇: STM32远程乒乓升级,基于(Wi-Fi模块AT指令TCP透传方式),MQTT通信控制升级
实现功能概要 前面的版本都是,定时访问云端的程序版本,如果版本不一致,然后下载最新的升级文件,实现升级. 这一节,在用户程序里面加入MQTT通信,执行用户程序的时候,通过接收MQTT的升级命令实现升级 ...
- Linux性能优化实战学习笔记:第十三讲
问题1:性能工具版本太低,导致指标不全 解决方案1: 这是使用 CentOS 的同学普遍碰到的问题.在文章中,我的pidstat 输出里有一个 %wait 指标,代表进程等待 CPU 的时间百分比, ...
- MySQL实战45讲学习笔记:第十一讲
一.如何在邮箱这样的字段上建立合理的索引 现在,几乎所有的系统都支持邮箱登录,如何在邮箱这样的字段上建立合理的索引,是我们今天要讨论的问题. 假设,你现在维护一个支持邮箱登录的系统,用户表是这么定义的 ...
- Java-volatile底层实现原理
一.volatile 代码 package jvm; public class VolatileVisibilityTest { private static boolean initFlag = f ...