Shell编程学习记录
一.shell中单引号和双引号的区别:
1)、单引号属于强引用,它会忽略所有被引起来的字符的特殊处理,被引用起来的字符会被原
封不动的使用,唯一需要注意的点是不允许引用自身;
2)、双引号属于弱引用,它会对一些被引起来的字符进行特殊处理,主要包括以下情况:
1:$加变量名可以取变量的值 ,比如:
[root@localhost ~]# echo '$PWD'
$PWD
[root@localhost ~]# echo "$PWD"
/root
2:反引号和$()引起来的字符会被当做命令执行后替换原来的字符,比如:
[root@localhost ~]# echo '$(echo hello world)'
$(echo hello world)
[root@localhost ~]# echo "$(echo hello world)"
hello world
[root@localhost ~]# echo '`echo hello world`'
`echo hello world`
[root@localhost ~]# echo "`echo hello world`"
hello world
3:当需要使用字符($ ` " \)时必须进行转义,也就是在前面加\ ;
[root@localhost ~]# echo '$ ` " \'
$ ` " \
[root@localhost ~]# echo "\$ \` \" \\"
$ ` " \
二.shell通配符(元字符):
*表示匹配任意多个字符
?匹配任意一个字符
[]匹配括号中任意一个字符
()在子shell中执行(cd /boot;ls)
{}集合touch file{1....9}
\转义字符
补充:echo带有颜色的输出:echo -e "\e[1();31(30-37是前景色,37-47是背景色显示颜色的数字)m需要打印的内容\e[0m"
例子:echo -e "\e[1;35mthis is text[0m"
交接printf格式化输出
三.shell变量
用特定的字符串表示不同的内容,变量需要以字母和下划线开头,区别大小写,使用变量为$变量名,$符号为引用变量的意思$变量名或者${变量名},$1、$2、$3.....为位置变量,把脚本需要输入的参数分别赋值给变量
read 参数就是键盘输入参数给脚本或者用$1....等直接用bash 脚本名 参数
自定义变量的作用域为当前shell
环境变量的作用域为当前shell和子shell,可以用export 变量名定义环境变量或者export 自定义变量名转换为环境变量
取消环境变量:unset 变量名
查看环境变量为 echo $变量名 env显示当前shell的所有环境变量 例如:env |greo back_dir2
source加载文件
位置变量:$1 $2 $3.....${10}
预定义变量:$0---脚本名 $*---所有的参数 $@---所有的参数 $#---参数的个数 $$---当前进程的PID $!---上一个后台进程的PID $?---上一个命令的返回值0表示成功
basename:取文件名 dirname:取路径名
变量赋值方式:
1.显示赋值:变量名=变量值,如:ip1=192.13.21.1(把字符串赋值给变量) school="Nanjing university"(如果把字符串赋值给变量,字符串中有空格的时候,需要用双引号引起来) today1=`date + %F`是反引号引起来,相当于执行反引号里面的语句再赋值,today2=$(data + %F)跟反引号的意思是一样的。以上均为字符串的赋值
2.read 从键盘赋值:
read 变量名 read -p(为加提示信息的意思) "提示信息:" 变量名 read -t 5(加上倒计时,等待5秒的时间) -p " "提示信息:" 变量名" read -n 2(只要前面两个字符) 变量名
··(反引号,命令替换)等价于$()的意思
shell当中变量是没有数据类型的,全部是字符串类型
变量的运算:
1.整数运算
方法一:expr,例如:expr 1 + 2 expr $num1 + $num2
方法二:$(()),例如:$(($num1+$num2)) $((num1 + num2))
方法三:$[],例如:$[5+2]
方法四:let let sum=2+3
注意:脚本中运用比较多的是方法二和方法四
注意:bash -vx 要执行的脚本 为调试状态执行脚本
2.小数运算:
"2*4" |bc "2^4" |bc(2的4次方) “scale=2;6/4” |bc
变量内容的删除和替换:
获取变量的长度${#变量名},如:url是变量名,${#url}
从前往后删除:${url#*.}从前往后最短匹配
从前往后删除到匹配到的最后一个:${url ##*.},正则匹配,从前往后最长匹配,贪婪模式
从后往前最短匹配:${url%*.}
从后往前最长匹配,贪婪模式:${url%%*.}
索引及切片:
${url:0:5}----取从第0个到第5个 ${url:5}----- 从第5个开始切到最后一个 ${url:5:5}-----从第5个开始取后面5个
内容的替换:
${url/被替换的内容/需要替换的内容} 贪婪替换:${url//被替换的内容/需要替换的内容}
变量的替代:
unset 变量名为取消变量
echo(必须加上$) ${变量名-新的变量值}:变量没有被赋值:会使用”新的变量值“替代,变量有被赋值(包括空值):不会被替代
变量赋默认值有两种方式-或者:-两种
有类型变量(declare和typeset命令都是用来定义变量类型的):
declare命令参数:
-r:将变量设为只读 -i:将变量设为整数 -a:将变量定为数组 -f:显示此脚本前定义过的所有函数及内容 -F:仅显示此脚本前定义过的函数名 -x:将变量声明为环境变量
例如:declare -r(命令参数) 变量名
取消变量声明:declare +r declare +x等
shell中特殊符号的意思:
()------在子shell中执行命令,(())-----数值比较,运算C语言, $()命令替换(和反引号··的意思一样,先执行里面的命令)。$(())----整数运算,{}----集合,${}----变量的应用或者变量的替换,[]---条件测试,[[]]-----条件测试,支持正则=~,$[]-----整数运算
执行脚本:
./01.sh 需要执行权限 在子shell中执行 此种执行为脚本路径执行
bash 01.sh 不需要执行权限 在子shell中执行
.01.sh 不需要执行权限 在当前shell中执行
source 01.sh 不需要执行权限 在当前shell中执行
提示:通常修改系统配置文件中如/etc/profile的PATH等变量后,使之在当前shell中生效
脚本调试:
sh -n 02.sh 仅调试syntax error
sh -vx 02.sh 以调试的方式执行,查询整个执行过程(可以看到整个脚本的执行过程)
四.shell条件测试:有三种类型文件测试 数值比较 字符串比较
格式1:test条件表达式
格式2:[条件表达式]
格式3:[[条件表达式]]
man test(test是条件测试的命令)
====文件测试[操作符 文件或目录]
例如:[ -d /home ] [-e dir|file]-----只要一个存在就返回真值
4.If条件判断语句:
shell脚本开始是固定表达式:#!/usr/bin/bash定义用哪个解释器执行叫做shellbang
if (表达式)
语句1
else
语句2
fi
逻辑运算符解析:
-f:判断文件是否存在 eg:if [ -f filename ]
-d:判断目录是否存在eg: if [ -d dic ]
-eq:等于 整型比较
-ne:不等于 整型比较
-lt :小于
-gt :大于
-le :小于或者等于
-ge:大于或等于
-a:双方都成立(and)逻辑表达式 -a 逻辑表达式
-o:单方成立(or)逻辑表达式
-z :空字符串
C风格的比较:
例如:((a > b)) ((a==b)) 这类的
字符串比较:
注意:使用双引号,字符串变量最好加上引号
["$USER"="root"];echo $? ["$USER"=="root"];echo $?
[ -z "$BBB"] 字符长度是为0 [ -n "$BBB"] 字符长队不为0
[条件1 -a 条件2]----两个条件为真才为真 [条件1 -o 条件2] ----其中一个为真就为真
[[条件1 && 条件2]]----与上面一样 [[条件1 || 条件2]]-----与上面一样
shell特性补充:
/bin/bash -n 脚本名称:测试脚本是否存在问题,如果没有输出则脚本没有问题。
>符号是覆盖原来的内容,>>是追加或者添加的意思.
$0当前脚本名称(环境变量)$1(环境变量)脚本需要输入的参数,$?前一个命令的返回值,$符号的意义就是引用变量的意思
``(反引号)代表里面的代码执行会出现一个结果
$UID系统环境变量,显示当前的登陆用户,如果是0就是root用户
bash和./都是在子shell中执行,.bash和source +脚本名都是在当前shell执行,如果想要执行的脚本影响到当前shell则采用后面两种执行方法。
系统级别的文件/etc/profile /etc/bashrc
用户级别的文件:~./bashrc是用户家目录下的文件,~/.bash_profile
<<-EOF
输入
EOF,把输入传给程序去执行
命令排序:
;不具有逻辑判断,&& || 具有逻辑判断
命令 1 && 命令2,命令1执行成功才执行命令2
命令 1 || 命令2,命令1执行失败才执行命令2
命令 1; 命令2,命令1执行成功不成功都会执行命令2
命令 &--后台执行
命令 &>/dev/null-- 混合定向(标准输出1,错误输出2)
判断一个变量是数字[ [ $num1 = ~^[0-9]+$ (正则表达式)] ]---判断这个变量是不是匹配这个正则的模式
5.case语法结构
case 变量 in
模式1)
命令序列1
;;
模式2)
命令序列2
;;
*)
无匹配后命令序列
esac
嵌套判断:
if [条件];then
语句
elif[条件];then
语句
else
语句
fi
((条件计算用了运算符号,如用4>5)),[[判断目录是否存在或者用比较符号不是运算符号]]