shell复习笔记
shell概念
1.
ls -l /bin/*sh #查看系统中的脚本解释器。
2.
#!/bin/bash #开头第一行的#,不是注释,其他都是
#指定由哪一个解释器来执行脚本中的文件。
3.
sh test.sh #指定解释器sh执行。sh是bash的软连接。
bash test.sh #指定解释器bash执行。
./path/test.sh #指定路径执行
4.
sh test2.sh #用sh执行,系统会启动新的进程执行子脚本,执行完就返回父shell,
#变量或函数无法保留。
. test2.sh #通过source或“.”加载执行过的脚本,系统不会新建进程执行子shell,
.后面空格键 #都是在当前Shell中执行脚本,因此在脚本结束之后,
#脚本中的变量(包括函数)值在当前Shell中依然存在.
shell-的变量
1.
$A 和 ${A} #功能是一样的。推荐使用后者的语法或"${A}" 的用法。
${WEEk}day #若变量和其他字符组成新的变量就必须给变量加大括号{}。
2.
环境变量
export 变量名=value #第一种方法
变量名=value;export 变量名 #第二种方法。注意也可以一次导出多个变量名--> export 变量名 变量名 变量名
declare -x 变量名=value #第三种方法
3.
用env(printenv)或set显示默认的环境变量
用unset取消本地变量和环境变量
unset aa #只是临时生效,退出再登录就恢复了。
4.
shell局部变量
普通字符串变量定义
变量名=value #解析输出,适用简单连续的数字、字符串、路劲名等
变量名=‘value’ #原样输出,适合于定义显示纯字符串。
变量名=“value” #解析输出,适合于字符串中附带有变量的内容的定义。
a=192.168.1.2-$a 执行结果 a=192.168.1.2-192.168.1.2
b='192.168.1.2-$a' 执行结果 b=192.168.1.2-$a
c="192.168.1.2-$a" 执行结果 c=192.168.1.2-192.168.1.2-192.168.1.2
习惯:数字不加引号,其他默认加双引号。
5.
把一个命令当做变量
#用 反引号 的方法
cmd=`ls` //把命令ls,赋给cmd
echo $cmd //输出cmd命令就相当于执行 ls命令
bin boot cdrom dev etc home initrd.img initrd.img.old lib lib32 lib64
#用 $() 的方法
$ cmd2=$(ls) //把命令ls,赋给cmd2
6.
shell-的特殊变量-位置变量
$0 #获取当前执行的shell脚本的文件名,包括路径
$n #获取当前执行的shell脚本的第n个参数值,n=1..9,当n为0时表示脚本的文件名,
#如果n大于9,用大括号括起来${10}.
$# #获取当前shell命令行中的参数的总个数.
7.
shell-的特殊变量-进程状态变量
$$ #获取当前shell的进程号(pid)
$? #获取执行上一个指令的返回值(0为成功,非零为失败)
8.
shell-的特殊变量-难点理论
$*和$@的区别例子
$* #将所有的命令行所有参数视为单个字符串,等同于“$1$2$3”
$@ #将命令行每个参数视为单独的字符串,等同于"$1" "$2" "$3"。
#这是将参数传递给其他程序的最佳方式,因为他会保留所有内嵌在每个参数里的任何空白。
shell-变量的字串应用技术
aa="I am scajy" #定义变量
1.
echo ${#aa} #返回字符串aa变量字符串的长度
10
2.
echo ${aa:2} #截取aa变量字符串从第2个字符之后开始取,默认取后面字符的全部
am scajy
3.
echo ${aa:2:2} #截取aa变量字符串从第2个字符之后开始取,取两个字符
am
4.
echo ${aa#I} #从变量aa开头开始删除最短匹配 "I“ 子串
am scajy
5.
echo ${aa%scajy} #从变量aa结尾开始删除最短匹配 “scajy” 子串
I am
6.
echo ${aa/I/520} #使用520字符串,来代替变量aa第一个匹配的I字符串
520 am scajy
7.
echo ${aa/%scajy/520} #先删除scajy,再替换成520
I am 520
8.
aa="I am scajy,I am scajy,I am scajy,I am scajy "
echo ${aa//I am/520 1314} #使用520 1314 字符串,来全部替换变量aa开头开始匹配的I am 字符串
520 1314 scajy,520 1314 scajy,520 1314 scajy,520 1314 scajy
shell-变量的数值运算符-计算双括号(())的使用
1.
(())用法:shell的算术运算符合都置于"$(("......."))"的语法中。
echo $((a+=1)) #赋值运算符(相当于a=a+1)
echo $((3>2)) #比较大小,3大于2,得出结果为1,在(())里比较大小,1为真,0为假
echo $((a++)) #先输出a的值,因为a为10,所以输出10
echo $((++a)) #先++,在输出值,所以是11
echo $(( $myvar + 1 )) #( ( ) ) 两边有几个空格不敏感,也可以没有。带变量计算
let命令的用法:let 赋值表达式
1.
let赋值表达式功能等同于:((赋值表达式))
i=2
let i=i+8
echo $i 结果 10
expr(evaluate expressions)命令的用法:
1.
expr命令一般用于整数值,当也可用于字符串,用来求表达式变量的值,同时expr也是一个手工命令行计算器。
2.
expr 2 + 2 #结果 4 运算符左右要有空格
expr 2 \* 2 #结果 4 乘号必须用反斜线屏蔽其特定含义。
3.
expr $[$a+$b]表达式形式,其中$a $b可以为整数值
expr $[2+3]
4.
例子:持续等待输入连续判断,整数就退出,错误继续判断输入
while true
do
read -p "pls input:" a
expr $a + 0 &>/dev/null
if [ $? -eq 0 ]
then
echo int
exit 1
else
echo chars
fi
5.
echo $(expr length "$chars") #通过expr计算字符串的长度
shell-变量的数值运算-bc-typeset-中括号等方法介绍
1.
bc命令的用法:
bc是unix下的计算器,它也可以用在命令行下面:
echo 3.5+5|bc 结果:8.5
2.
typeset命令的用法:使用整数变量直接进行计算
typeset -i A=1 B=3
A=A+B
echo $A ----> 4
3.
$[ ]的用法: echo $[3+2] --> 结果 5
shell-变量输入内置read命令详解
1.
格式:read [参数] [变量名]
read -t 5 -p "please input two nomber:" a1 a2
#获取两个参数给变量a1 a2,-t 等待5s输入时间,-p 读之前会打印提示符"please input two nomber:"
-n:字符数:read命令只接受指定的字符数,就会执行
-s:隐藏输入的数据,适用于机密信息的输入
shell-添加条件测试的多种方法语法介绍与简单实战
1.条件测试语法的三种格式
# -f 若文件存在并且为普通文件则返回 真
# -r 文件存在并且可读则 真
test -f filename && echo true ||echo false #条件测试语法 格式1
[ -f filename ] && echo true ||echo false #条件测试语法 格式2
[[ -f filename ]] && echo true || echo false #条件测试语法 格式3
shell-字符串及整数操作符讲解与多实践
1.字符串测试操作符 一元
[ -z "$myvar" ] # -z 比较字符串长度是否等于零,如果等于零则为为真,zero
[ -n "$myvar" ] # -n 比较字符串长度是否不为零,如果不为零则为真
2.整数二元比较操作符
[ ] [[]] #字母和符号在不同的括号中使用
-eq == 等于
-ne != 不等于
-gt > 大于
-ge >= 大于等于
-lt < 小于
-le <= 小于等于
if[ "$a" \< "$b" ] #在单[ ]中需要转义,因为shell也用 “<” 和 “>” 重定向
if[ "$a" \> "$b" ]
2.1
二元数字比较:
[ 2 > 1 ] && echo 1 ||echo 0 结果:1
[ 2 -gt 1 ] && echo 1 ||echo 0 结果:1
2.2
二元字符比较:
[ "a" \> "bc" ] && echo 1 ||echo 0 结果:0
[ "a" \< "bc" ] && echo 1 ||echo 0 结果:1
shell-逻辑操作符讲解与文件条件测试多范例
1.操作符 #注意括号两端,必须要有空格。
[ ] [[]] #字母和符号在不同的括号中使用
-a && 与
-o || 或
! ! 非
2.条件测试举例
[ -f "$file1" ] && echo 1 || echo 0
#变量$file加了双引号,这是编程的好习惯,可以防止很多意外的错误发生。
shell流程控制之if语句
1.
if [ 条件判断式 ];then #如果条件成立,执行下面的程序
程序
fi #if语句结束的标志
或者
if [ 条件判断式 ] #中括号与条件判断式直接必须有空格
then
程序
fi
2.
if [ 条件判断式 ];then
........................
else
.......................
fi
3.
if [ 条件判断式1 ];then
..................
elif [ 条件判断式2 ];then
..................
else
..................
fi
shell流程控制之多分支case语句
1.
case $变量名 in
"值1") 如果变量的值等于值1,则执行程序1;;
"值2") 如果变量的值等于值2,则执行程序2;;
......
*) 如果变量的值都不是以上的值,则执行此程序;;
esac
shell流程控制之while循环
1.
while [ 条件判断式 ]
do
程序
done
shell流程控制之until循环
1.概述:
utile循环时,只要条件判断式不成立则进行循环。一旦条件成立,则终止
until [ 条件判断式 ]
do
程序
done
shell流程控制之for循环
1.
for ((初始值;循环控制条件;变量变化))
do
程序
done
Shell - bash基本功能之管道符、通配符
1.
多命令顺序执行:
执行符 格式
; 命令1;命令2 #按照顺序一个一个执行。某个命令报错,会忽略,继续执行下面的命令
&& 命令1&&命令2 #当命令1正确执行时,才会执行命令2。
|| 命令1||命令2 #当命令1执行错误时,会执行命令2。1正确则只执行1,不执行2。
2.
管道符
命令1 | 命令2 命令1的正确输出作为命令2的操作对象
3.
通配符
? 匹配一个任意字符
* 匹配0或任意多个任意字符,也就是可以匹配任何内容
[] 匹配中括号中任意一个字符
[-] 匹配中括号中任意一个字符,-代表范围。如:[a-c]
[^] 逻辑非,表示匹配不是中括号内的字符
bash中一些其他的特殊符号
1.
'' 单引号。在单引号中的所有特殊符号都没有特殊含义
"" 双引号。在双引号中的特殊符号都没有特殊含义,
但是“$”、“·”和“\”是例外,拥有“调用变量”、“引用命令”、“转义符”的特殊含义。
$() 和反引号一样,用来引用系统命令
$ 用于调用变量的值
\ 转义符
Shell - bash基本功能之输出、输入重定向
1.
标准输入输出
文件描述符:
0 代表标准输入设备, /dev/stdin
1 代表标准输出设备, /dev/sdtout
2 代表标准错误输出设备 /dev/sdterr
2.
输出重定向
2.1
标准输出重定向:
命令 > 文件:以覆盖的方式,把命令的正确输出输出到指定的文件或设备中。
##文件不存在则创建,文件存在则覆盖
命令 >> 文件:以追加方式,把命令的正确输出输出到指定的文件或设备中。
2.2
标准错误输出重定向
错误命令 2> 文件:以覆盖的方式,把错误的输出输出到指定的文件或设备中
错误命令 2>> 文件:以追加的方式,把错误的输出输出到指定的文件或设备中
2.3
正确输出和错误输出同时保存
命令 > 文件 2>&1:覆盖,把正确输出和错误输出都保存在同一个文件中
命令 >> 文件 2>&1:追加,把正确输出和错误输出都保存在同一个文件中
命令 &> 文件:覆盖,把正确输出和错误输出都保存在同一个文件中
命令 &>> 文件:追加,把正确输出和错误输出都保存在同一个文件中
命令>>文件1 2>>文件2:把正确的输出追加到文件1中,把错误的输出追加到文件2中
2.4
特殊文件:/dev/null
命令 &>/dev/null #黑洞,垃圾站。不想看到命令的结果,就把命令重定向到/dev/null中
3.
输入重定向
一般输入设备总是键盘,如果把文件的内容作为输入,这个就是“输入重定向”
3.1
wc命令 :
wc 【选项】【文件名】
无 输入字符,ctrl+d结束,最后会统计你输入了多少行,单词,字符
-c 统计字节数
-w 统计单词数
-l 统计行数
3.2
输入重定向:
命令 < 文件:把文件作为命令的输入
wc < test.log # wc统计test.log文件
命令 << 标识符:把标识符直接内容作为命令的输入
wc << t #wc统计,遇到t字符则停止
shell编程之正则表达式
正则表达式的作用:
在文件中提取有用的字符串。字符串的模式分割、匹配、查找及替换
余下未记录