脚本的编写规则;
惯例后缀名是.sh
在linux中,文本以#开头的是注释,以#!/bin/bash开始是脚本的标志,必需。
脚本执行:
首先赋予执行权限chmod 755 first.sh 执行脚本 ./frist.sh
./代表当前目录,Linux执行脚本默认不查找当前目录,需要加./
也可以直接绝对路径
直接执行 bash first.sh 可以直接执行
1 shell变量
1.1 分类
用户自定义变量
环境变量:保存和系统相关的变量,可以自定义,但是变量名和变量作用是固定的(默认是大写)
位置参数变量:向shell脚本中传递参数的变量
预定义变量:shell 脚本 定义的变量,不能自定义,变量作用是固定的
1.2 定义和输出
linux 所有的变量类型都是字符类型,特别注意。
name=string “=”俩边不能有空格 String 可以用”string” 或 ‘string’ ,双引号允许变量替换,单引号不可以
字符串拼接:
name=123
name=${name}123 这样 name 就变为123123
输出:
输出 echo $PATH, 或者echo ${PATH} echo I love you 都可以
echo – e 可以 输出特殊格式,例如tab,换行,颜色输出等
echo–e “\e[1;32m 文本 \e[0m” 32m是颜色
echo 输出中!是一个特殊的字符
修改变量的值:name=newString
set : 查看所有变量 使用set -u ,当查看变量不存在是,会报错,默认是不开启的
删除变量 unset name
比较重要的几个环境变量:
PATH, HOME,PATH,RANDOM(随机数)
PATH :我们使用命令的查找路径,可以将我们自己的命令添加到PATH中,这样就可以直接运行了。
PS1 : 命令提示符,可以自己设置
PS2 : 当使用\来表示命令未输完时,下一行的提示符。
自定义提示符颜色
PS1="\[\e[37;40m\][\[\e[32;40m\]\u\[\e[37;40m\]@\h \[\e[36;40m\]\w\[\e[0m\]]\\$ "
env:查看所有环境变量ulimit :可以限制用户创建文件大小以及其他。
位置参数变量:
$n:n 为数字,$0 代表命令本身,$1-$9 代表第一到第九个参数,十以上的参数需要用大括号包含,如 ${10}。
$*:这个变量代表命令行中所有的参数,$* 把所有的参数看成一个整体。相当于将所有参数拼接为字符串。
$@:这个变量也代表命令行中所有的参数,不过 $@ 把每个参数区分对待。相当于将所有参数封装进数组中,使
用for循环可以读取参数
$#:这个变量代表命令行中所有参数的个数。
进行数值运算:
$((num1 + num2)) //$ (()) 即可获得计算结果
预定义变量:
使用read命令来进行预先定义shell脚本的变量:
read option paramName 运行程序后输入。可以输入提示信息。 read 参数 变量名, 将键盘的输入赋值给指定的变量名
-p “提示信息” 输入前显示提示信息
-t “秒数” 等待时间
-s 隐藏输入数据
-n 字符数:只接受指定的字符数。
示例:
#! /bin/bash
read -p "please print you name: " name
echo $name
read -p "please print you age: " -t 30 age
echo $age
read -p "please print you password : " -s password
echo $password
read -p "please print you sex : " -n 1 sex
echo $sex
1.3 作用域
局部变量:所有自定义的变量默认都是局部变量,范围为当前shell
全局变量:环境变量是全局变量,范围为当前shell即其所有子shell
export 可以将局部变量变为全局变量
export 变量1 [变量2]
不带参的export命令可以查看当前所有的环境变量
set 方法和export类似,但比他更加强大可以将所有变量全部列出来。
bash 进入子shell
exit 退出当前shell
注意:要想在子shell中使用父shell的变量,变量必须为全局变量
变量在子shell中值的修改不会传回父shell
3 输出重定向和输入重定向
&>> 将错误信息和正确信息输入到摸个文件内,>>俩边没空格
命令1 >> 文件1 2>>文件2 已追加的方式将正确信息输入到文件一中,错误信息输入到文件二中,标红的没空格
tee 可以将数据流分别送到文件和屏幕上。 ls | tee a.txt. 会在屏幕上打印信息,并且a.txt内也会有内容。
4 管道
过滤,将前一个命令的结果作为后一个命令的输入。管道命令必须是能够接受标准输出。例如:less, more, head, tail,grep,cut,像cp,mv等就不可以
格式: 命令1 | 命令2 | 命令3
sed 命令: 可以直接对标准输出进行删除,取代,替换 sed [options] [动作],动作必须在单引号内
ll /etc |sed '2,3d' ,删除第二三行
ll /etc | sed '2akkkk'在第二行后添加 kkkk,如果需要第二行前加的话,将a改为i就可以啦,如果需要多啊行的话,需要\来进行换行
ll /etc | sed '2,5ckkkkkk'用kkkk来取代2-5行
ll /etc | sed -n'2,5p' 将2-5行打印出来,需要把选项-n加上,代表严格模式,不然会重复输出3-5行
当使用复杂正则表达式是,例如: | ,+ ? ()是,此时grep就不适合了,需要用到egrep 或者grep -e
printf 命令:与C语言中的printf
支持管道的命令: less , more, head,tail,grep,cut
5 元字符
;将多个命令组合在一起,即使其中一个出错,其他命令也会执行
&& 具有短路效应,如果前面的出错了,后面的命令不会执行
|| 前面的命令执行错误,后面的才会执行
命令1 && echoyes ||echo no 可以判断命令是否执行正确
()
{}
\ 跳脱字符,如果命令一行写不下,可以使用它多行输入
> >> 输出重定向
$() 可以进行命令替换 printf '%s\t%s\t%s\t' $(cat a.txt) 可以现将cat a.txt命令执行,并将结果替换