shell 学习笔记
shell脚本就是将完成一个任务的所有命令按照先后顺序,自上而下写入到一个文本文件然后给予执行权限。
chomd +x 文件名
./文件名#执行
文件名名要有意义
脚本编写
#!/usr/bin/bash
//#!是特例,解释运行的环境
#Author //作者
#Created //Time时间
#描述
运行脚本
1、给执行权限 chmod +x、用路径运行
2、解释器直接运行 bash、sh
特殊符号
~:家目录
-:上一级目录
!:执行历史命令
+ 、—、*、/, %:对应数学运算
&:后台执行
*:shell通配符,匹配所有
?:shell通配符,匹配除回车以外的一个字符
;:分号可以在shell中执行多个命令
|:管道符,是一个是一个命令作为下一个命令的输入
\:转义字符
'':反引号,命令中执行命令
‘’:单引号,脚本中字符要有单引号引起来,不同于双引号,单引号不解释变量
“”:双引号,脚本中出现的字符用双引号引起来
> :重定向覆盖原有数据
>> : 重定向追加输出,在原有数据的末尾添加
< :重定向输出
<< :重定向追加输出
/dev/null 回收站
echo命令介绍
功能:将内容输出到默认显示器,输出后换行
-n:当指定-n选项时,其后的换行符被抑制;即不会在最后自动换行。
-e:当指定-e选项时,则将解释以下反斜杠转义字符:
\\ - 插入反斜杠(\)字符。
\a - 警报(BEL)
\b - 显示退格字符。
\c - 抑制任何进一步的输出,最后不加上换行符号
\e - 显示转义字符。
\f - 显示换页符。
\n - 显示新行。
\r - 显示回车。
\t - 显示水平选项卡。
\v - 显示垂直选项卡。
-E:当指定-E选项时,禁用转义字符的解释,这是默认值。
使用echo命令时需要考虑几点:
● 在将参数传递给echo命令之前,shell将替换所有变量、通配符匹配和特殊字符。
● 尽管没有必要,但是用双引号或单引号将传递给echo命令的参数括起来是一种很好的编程实践。
● 使用单引号时(’’)时,将保留引号中包含的每个字符的字面值。变量和命令将不会展开。
用法:seq [选项]… 尾数
或:seq [选项]… 首数 尾数
或:seq [选项]… 首数 增量 尾数
以指定增量从首数开始打印数字到尾数。
-f, --format=格式 使用printf 样式的浮点格式
-s, --separator=字符串使用指定字符串分隔数字(默认使用:\n)
-w, --equal-width 在列前添加0 使得宽度相同
–help 显示此帮助信息并退出
–version 显示版本信息并退出
如果省略了首数或者增量,则默认其值为1,即使这样尾数仍小于首数。
首数、增量和尾数均以浮点数形式解释。当首数小于尾数时增量一般为正值,
相反在首数大于尾数时增量一般为负数。
指定的格式必须适用于显示"double"类型的参数;当首数、增量和尾数均为指定
精确度的定点十进制数时默认为"%.精确度f",否则默认为"%g"。
格式化输出
字体背景颜色
echo -e "\033[30m 黑色字 \033[0m"
echo -e "\033[31m 红色字 \033[0m"
echo -e "\033[32m 绿色字 \033[0m"
echo -e "\033[33m 黄色字 \033[0m"
echo -e "\033[34m 蓝色字 \033[0m"
echo -e "\033[35m 紫色字 \033[0m"
echo -e "\033[36m 天蓝字 \033[0m"
echo -e "\033[37m 白色字 \033[0m"
字符串颜色
echo -e "\033[40;37m 黑底白字 \033[0m"
echo -e "\033[41;37m 红底白字 \033[0m"
echo -e "\033[42;37m 绿底白字 \033[0m"
echo -e "\033[43;37m 黄底白字 \033[0m"
echo -e "\033[44;37m 蓝底白字 \033[0m"
echo -e "\033[45;37m 紫底白字 \033[0m"
echo -e "\033[46;37m 天蓝白字 \033[0m"
echo -e "\033[47;30m 白底黑字 \033[0m"
效果
/033[0m #关闭所有属性
/033[1m #设置高亮度
/033[4m #下划线
/033[5m #闪烁
/033[7m #反显
/033[8m #消隐
输入
read命令
read 命令选项
-p打印信息
-t限定时间
-s不回显
-n输入字符个数
变量
1、变量的介绍
定义变量时,变量名不加美元符号($,PHP语言中变量需要)
注意,变量名和等号之间不能有空格,这可能和你熟悉的所有编程语言都不一样。同时,变量名的命名须遵循如下规则:
命名只能使用英文字母,数字和下划线,首个字符不能以数字开头。
中间不能有空格,可以使用下划线(_)。
不能使用标点符号。
不能使用bash里的关键字(可用help命令查看保留关键字)。
2、变量的分类
变量类型
运行shell时,会同时存在三种变量:
- 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
- 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
- shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行
1、本地变量:用户的私有变量,只有本用户可以使用,保存在家目录下的,bash_profile、.bashrc文件中
2、全局变量:所有用户都可以所有的保存在/etc/profile、/etc/bashrc文件中
3、用户自定义变量:脚本中的变量
3、变量的管理
定义变量:name=value
读取变量内容符:$
读取方法:$变量名
取消变量:unset 变量名
定义全局变量:前面加export
定义永久变量:写在配置文件里面/etc/profile、/etc/bashrc
数组
可以存多个变量的一种数据结构
数组语法
数组名称=(元素1 元素2...)
数组读出
${数组名称}[索引]
默认从0开始
数组赋值
一次赋一个值
array[0]=“l”
一次赋值多个
array={}
参看数组
declare -a
遍历数组
关联数组
流程控制-if判断语句
数学比较运算比较的是整形
-eq 等于
-gt 大于
-lt 小于
-ge 大于或者等于
-le 小于或者等于
-ne 不等于
shell 下返回0为真,返回1为假
文件比较与检查
1、文件状态:
表达式:[ -e 文件路径 ] 有空格隔开
例如:[ -e /root ] 判断/root 是否存在
1) -e 是否存在 存在为真
2) -d 是否是目录 是目录为真
3) -f 是否是文件 是文件 为真
4) -x 是否有执行权限 有执行权限为真
5) -w 是否有写权限 有写权为真
6) -r 是否有读权限 有读权限为真
7)-G检查文件是否存在并且默认组为当前用户
8)-O检查文件是否存在并且被当前用户拥有
字符串比较运算
字符串一定要用引号引起来
==等于
!=不等于
-n检查字符串长度是否大于0
-z检查字符串的长度是否为0
逻辑运算
&& 与
|| 或
!非
if语句
单if:只要一步判断。条件返回真干什么或者条件返回假干什么
if [ condition ] #condition 的值为true或者fales
then
commands
fi
if-then-else语句
两步判断,条件为真干什么,条件为加干什么
if [ condition ] #condition 的值为true或者fales
then
commands1
else
commands2
fi
if 高级应用
if((数学表达式));
#双小圆括号使用比较运算符>>==<<!
then
if [[ ]]双小方括号,可以在条件中使用通配符字符串匹配
for循环语句
条件循环
或者for i in语法
语法
for var in value1 value2 ......
do
commands
done
语法2
for((变量;条件;自增减运算))
do
代码块
done
明确知道循环次数用for
不知道用while
whlie循环
while [ condition ] #注意条件为真才会循环,数学比较运算、字符串比较运算、文件类型、逻辑运算、赋值运算
do
commands
done
while的嵌套
嵌套 if for while
until语句
与while正好相反,条件为假开始执行,条件为真停止执行。
while [condition ]
do
commands 代码块
done
case 语法
语法
case 变量 in
条件1)
执行代码块1
;;
条件2
执行代码块2
;;
........
esac
#注意每个代码块执行完毕要以;;结尾代表结束,case结尾要以倒过来写的esac来结尾。
shell特殊变量
$0 当前脚本的文件名
$n 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。
$# 传递给脚本或函数的参数个数。
$* 传递给脚本或函数的所有参数。
$@ 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。
$? 上个命令的退出状态,或函数的返回值。
$$ 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。
函数
将代码模块化,一个模块实现一个功能。
1、代码模块化,调用方便、节省内存
2、代码量少、排错简单
3、可以改变代码的执行的顺序
语法 一:
函数名(){
代码块
return N
}
语法 二:
function 函数名{
代码块
return N
}