|shell基础内容(一)

文章图片

文章图片

文章图片

文章图片

文章图片

shell种类
Bourne Shell(/usr/bin/sh或/bin/sh)
Bourne Again Shell(/bin/bash)
C Shell(/usr/bin/csh)
K Shell(/usr/bin/ksh)
Shell for Root(/sbin/sh)
shell脚本
第一个shell脚本
#!/bin/bash
#!预定的标记告诉系统这个脚本需要什么解释器来执行
/bin/bash解释器
运行脚本的两种方法
chmod添加权限 , ./test.sh执行脚本
作为解释器的参数/bin/bash test.sh
shell变量
变量声明var_name=value
变量名和等号之间不能有空格
变量名的规范和其他语言的变量要求一样
变量使用
使用一个定义过的变量使用$var即可
echo $var_name
echo ${var_name
{可选项 , 帮助解释器识别变量的边界
echo \"I am good at ${skillScript\"
变量赋值
var_name=\"a\"
只读变量
myurl=\"wwwxxxxxxx\"
readonly myurl
【|shell基础内容(一)】删除变量
unset myurl删除之后 的变量不能被使用
类型
局部变量
在脚本或命令中定义 , 仅在当前shell实例中有效
环境变量
所有的程序 , 包括shell启动程序 , 都能访问环境变量
shell变量
shell程序设置的特殊变量
数据类型
数字
字符串
单引号
单引号里的任何字符都会原样输出 , 单引号里的变量是无效的
单引号字符串里不能出现单独的单引号(对单引号使用转义字符也不行)可成对出现 , 作为字符串拼接使用
双引号
双引号里可以有变量
双引号里可以出现转义字符
string=\"runob\"
获取字符串长度
echo ${#string
结果5
提取子字符串
echo ${string:1:4
结果unoo
查找子字符串
echo `expr index \"$string\"nb`
查找字符n或b的位置(哪个字母先出现就计算哪个)
数组
shell支持一维数组不支持多维数组
array_name=(value0value1value2)
array_name=(
value0
value1
value2
value3
)
array_name[0
=value0
array_name[1
=value1
array_name[n
=valuen
数组元素的读取
${array_name[index
按下标读取元素
${array_name[@
获取所有的元素
length=${#array_name[@
length=${#array_name[*
lengthn=${#array_name[n
获取数组单个元素的长度
注释
#开的行就是注释
每一行加个#符号太费力了 , 可以把这一段要注释的代码用一对花括号括起来 , 定义成一个函数 , 没有地方调用这个函数 , 这块代码就不会执行 , 达到了和注释一样的效果
多行注释
:<<EOF
注释内容...
EOF
EOF 也可以使用其他符号:
:<<’
注释内容...
‘
:<<!
注释内容...
!
传递参数
向脚本传递参数
脚本内获取参数的格式为$nn代表一个数字 , 0为执行的文件名(包含文件路径) , 1代表第一个参数 , 2第二个 。。。。。。
$#
传递到脚本的参数个数
$*
以一个单字符串显示所有向脚本传递的参数 。
如\"$*\"用「\"」括起来的情况、以\"$1 $2…$n\"的形式输出所有参数
$@
与$*相同 , 但是使用时加引号 , 并在引号中返回每个参数 。
如\"$@\"用「\"」括起来的情况、以\"$1\" \"$2\"…\"$n\"的形式输出所有参数
$$
脚本运行的当前进程ID号
$!
后台运行的最后一个进程的ID号
$-
显示Shell使用的当前选项 , 与set命令功能相同
$?
显示最后命令的退出状态 。 0表示没有错误 , 其他任何值表明有错误 。
示例
[root@jumpserver120 ~
# vim test.sh
#!/bin/bash
echo \"---\\$* 演示---\"
for i in \"$*\"
do
echo $i
done
echo \"--\\$@ 演示---\"
for i in \"$@\"
do
echo $i
done
echo \"--\\$\\# 演示---\"
echo $#
echo \"--\\$\\$ 演示---\"
echo $$
echo \"--\\$! 演示---\"
echo $!
echo \"--\\$\\演示---\"
echo $-
echo \"--\\$\\? 演示---\"
echo $?
运行结果
[root@jumpserver120 ~
# ./test.sh 1 2 3
---$* 演示---
1 2 3
--$@ 演示---
1
2
3
--$\\# 演示---
3
--$$ 演示---
21881
--$! 演示---
--$\\演示---
hB
--$\\? 演示---
0
基本运算符
算术运算符
expr
表达式计算工具
val=`expr 2 + 2`
echo \"连个数之和:$val\"
是反引号
a=10;b=20
+
加法 `expr $a + $b` 结果为30 。
-
减法 `expr $a $b` 结果为-10 。
*
乘法 `expr $a \\* $b` 结果为200
/
除法 `expr $b / $a` 结果为2 。
%
取余 `expr $b % $a` 结果为0 。
=
赋值 a=$b 将把变量b的值赋给a 。
==
相等 。 用于比较两个数字 , 相同则返回 true 。[ $a == $b
返回false 。
!=
不相等 。 用于比较两个数字 , 不相同则返回 true 。[ $a != $b
返回true 。
注意:条件表达式要放在方括号之间 , 并且要有空格 , 例如: [$a==$b
是错误的 , 必须写成[ $a == $b
。
关系运算符
-eq(equal) 检测两个数是否相等 , 相等返回 true 。[ $a -eq $b
返回false 。
-ne(not equal) 检测两个数是否不相等 , 不相等返回 true 。[ $a -ne $b
返回true 。
-gt(greater than) 检测左边的数是否大于右边的 , 如果是 , 则返回 true 。[ $a -gt $b
返回false 。
-lt(little than) 检测左边的数是否小于右边的 , 如果是 , 则返回 true 。[ $a -lt $b
返回true 。
-ge(great and equal) 检测左边的数是否大于等于右边的 , 如果是 , 则返回 true 。[ $a -ge $b
返回false 。
-le(little and equal) 检测左边的数是否小于等于右边的 , 如果是 , 则返回 true 。[ $a -le $b
返回true 。
布尔运算
! 非运算 , 表达式为 true则返回false , 否则返回true 。[ ! false
返回true 。
-o(or) 或运算 , 有一个表达式为 true则返回true 。[ $a -lt 20 -o $b -gt 100
返回true 。
-a(and) 与运算 , 两个表达式都为 true才返回true 。[ $a -lt 20 -a $b -gt 100
返回false 。
逻辑运算
&& 逻辑的 AND [[ $a -lt 100 && $b -gt 100
返回false
|| 逻辑的 OR [[ $a -lt 100 || $b -gt 100
返回true
字符串运算符
a='\"abc\";b=\"efg\"
= 检测两个字符串是否相等 , 相等返回 true 。[ $a = $b
返回false 。
!= 检测两个字符串是否相等 , 不相等返回 true 。[ $a != $b
返回true 。
-z(zero) 检测字符串长度是否为0 , 为0返回true 。[ -z $a
返回false 。
-n 检测字符串长度是否不为 0 , 不为0返回true 。[ -n \"$a\"
返回true 。
$ 检测字符串是否为空 , 不为空返回 true 。[ $a
返回true 。
文件测试运算符
-b file 检测文件是否是块设备文件 , 如果是 , 则返回 true 。[ -b $file
返回false 。
-c file 检测文件是否是字符设备文件 , 如果是 , 则返回 true 。[ -c $file
返回false 。
-d file 检测文件是否是目录 , 如果是 , 则返回 true 。[ -d $file
返回false 。
-f file 检测文件是否是普通文件(既不是目录 , 也不是设备文件) , 如果是 , 则返回 true 。[ -f $file
返回true 。
-g file 检测文件是否设置了 SGID位 , 如果是 , 则返回true 。[ -g $file
返回false 。
-k file 检测文件是否设置了粘着位(Sticky Bit) , 如果是 , 则返回true 。[ -k $file
返回false 。
-p file 检测文件是否是有名管道 , 如果是 , 则返回 true 。[ -p $file
返回false 。
-u file 检测文件是否设置了 SUID位 , 如果是 , 则返回true 。[ -u $file
返回false 。
-r file 检测文件是否可读 , 如果是 , 则返回 true 。[ -r $file
返回true 。
-w file 检测文件是否可写 , 如果是 , 则返回 true 。[ -w $file
返回true 。
-x file 检测文件是否可执行 , 如果是 , 则返回 true 。[ -x $file
返回true 。
-s file 检测文件是否为空(文件大小是否大于0) , 不为空返回true 。[ -s $file
返回true 。
-e file 检测文件(包括目录)是否存在 , 如果是 , 则返回 true 。[ -e $file
返回true 。
-S: 判断某文件是否socket 。
-L: 检测文件是否存在并且是一个符号链接
echo
显示普通字符串
echo \"It is a test\"
echo It is a test
显示转义字符
echo \"\\\"It is a test\\\"\"
显示变量
echo \"$name it is a test\"
显示换行
echo -e \"OK ! \ It is a test\"
显示不换行
echo -e \"OK! \\c\" #-e开启转义 , \\c不换行
显示结果定向至文件
echo \"It is a test\" > myfile
原样输出字符串 , 不进行转义或取变量(用单引号)
echo '$name\\\"'
$name\\\"
显示命令执行结果
echo `date`
这里使用的是反引号 `而不是单引号'
printf命令
格式化显示字符串
功能和C中的printf类似
语法
printf format-string [arguments...
formant-string
格式控制字符串
arguments
参数列表
例子
printf \"%-10s %-8s %-4.2f\\" 郭靖 男43
%s%c%d%f都是格式替代符代表字符串 , 字符 , 整数 , 小数
%-10s宽度为10个字符(-代表左对齐 , 没有代表右对齐)
%-4.2f格式化小数 , .2保留两位小数
printf转义序列
\\a 警告字符 , 通常为ASCII的BEL字符
\\b 后退
\\c 抑制(不显示)输出结果中任何结尾的换行字符(只在%b格式指示符控制下的参数字符串中有效) , 而且 , 任何留在参数里的字符、任何接下来的参数以及任何留在格式字符串中的字符 , 都被忽略
\\f 换页(formfeed)
\ 换行
\\r 回车(Carriage return)
\\t 水平制表符
\\v 垂直制表符
\\\\ 一个字面上的反斜杠字符
\\ddd 表示1到3位数八进制值的字符 。 仅在格式字符串中有效
\\0ddd 表示1到3位的八进制值字符
test
检查某个条件是否成立 , 它可以进行数值、字符和文件三个方面的测试
数值检查
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真
字符串测试
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真
文件测试
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真
流程控制
if else if
if
if condition
then
command1
command2
...
commandN
fi
if else if
if condition
then
command1
command2
...
commandN
else
command
fi
if else-if else
if condition1
then
command1
elif condition2
then
command2
else
commandN
fi
for循环
for var in item1 item2 ... itemN
do
command1
command2
...
commandN
done
shell 变量调用需要加$但是for的(())中不需要
#!/bin/bash
for((i=1;i<=5;i++));do
echo \"这是第$i次调用\";
done;
while循环
while condition
do
command
done
until 循环
until condition
do
command
done
until 循环执行一系列命令直至条件为true时停止
case
case 值in
模式1)
command1
command2
...
commandN
;;
模式2)
command1
command2
...
commandN
;;
esac
case语句为多选择语句 。 可以用case语句匹配一个值与一个模式 , 如果匹配成功 , 执行相匹配的命令
case...esac
case 值in
模式1)
command1
command2
command3
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac
break命令允许跳出所有循环(终止执行后面的所有循环)
continue命令与break命令类似 , 只有一点差别 , 它不会跳出所有循环 , 仅仅跳出当前循环 。
函数
定义函数
[ function
funname [()
{
action;
[return int;
demoFun(){
echo \"这是我的第一个shell函数!\"
echo \"-----函数开始执行-----\"
demoFun
echo \"-----函数执行完毕-----\"
#/bin/bash
#name:shell function study
#Desc:learn how to use functions
#Path:/root/function.sh
#Usage:
#Update:
#author:xttcqw
#Release:1.0
funWriteReturn(){
echo \"This function adds two Nmubers to the input\"
echo \"input first Number:\"
read aNum
echo \"input second Number\"
read bNum
echo \"The two Numbers are $aNum and $bNum !\"
return `expr $aNum + $bNum`
funWriteReturn
echo \"Thw sum of the input two Numbers is $?\"
函数返回值在调用该函数后通过 $?来获得 。
$10 不能获取第十个参数 , 获取第十个参数需要${10 。 当n>=10时 , 需要使用${n来获取参数 。
$# 传递到脚本或函数的参数个数
$* 以一个单字符串显示所有向脚本传递的参数
$$ 脚本运行的当前进程ID号
$! 后台运行的最后一个进程的ID号
$@ 与$*相同 , 但是使用时加引号 , 并在引号中返回每个参数 。
$- 显示Shell使用的当前选项 , 与set命令功能相同 。
$? 显示最后命令的退出状态 。 0表示没有错误 , 其他任何值表明有错误 。
shell输入/输出重定向
command > file 将输出重定向到 file 。
command < file 将输入重定向到 file 。
grep \"author\" < function.sh
筛选文件function.sh里的内容
#author:xttcqw
command >> file 将输出以追加的方式重定向到 file 。
n > file 将文件描述符为 n的文件重定向到file 。
标准输入文件(stdin):stdin的文件描述符为0 , Unix程序默认从stdin读取数据 。
标准输出文件(stdout):stdout的文件描述符为1 , Unix程序默认向stdout输出数据 。
标准错误文件(stderr):stderr的文件描述符为2 , Unix程序会向stderr流中写入错误信息 。
n >> file 将文件描述符为 n的文件以追加的方式重定向到file 。
n >& m 将输出文件 m和n合并 。
n <& m 将输入文件 m和n合并 。
<< tag 将开始标记 tag和结束标记tag之间的内容作为输入 。
Here Document 是Shell中的一种特殊的重定向方式 , 用来将输入重定向到一个交互式Shell脚本或程序 。
它的基本的形式如下:
command << delimiter
开始的delimiter前后的空格会被忽略掉 。
document
delimiter
结尾的delimiter一定要顶格写 , 前面不能有任何字符 , 后面也不能有任何字符 , 包括空格和tab缩进
它的作用是将两个 delimiter之间的内容(document)作为输入传递给command 。
/dev/null 文件
/dev/null 是一个特殊的文件 , 写入到它的内容都会被丢弃;如果尝试从该文件读取内容 , 那么什么也读不到 。 但是/dev/null文件非常有用 , 将命令的输出重定向到它 , 会起到\"禁止输出\"的效果 。
shell文件包含
. filename # 注意点号(.)和文件名中间有一空格
或
source filename
#!/bin/bash
. ./sh1.sh
echo $name
被包含的文件 test1.sh不需要可执行权限 。
推荐阅读
- 别再学习框架了,看看这些让你起飞的计算机基础知识
- 科大讯飞|Kubernetes如何改变美团的云基础设施?
- 芯片|全面解读我国在基础关键领域与国外的差距
- 王者荣耀|王者荣耀:位移多伤害高,上官婉儿伤害正确理解,基础连招教学
- 每天超神秀|被LGD淘汰后,IG宁王彻夜未眠,但训练内容让追随者大失所望
- 向太|郭碧婷快生了?向太心梗出院后,点赞很快能见到孙儿内容后删除
- 赵薇机场搭真清爽,穿基础款T恤配短裤休闲时尚,44岁气质很大气
- 逍遥单机游戏|你如何看待游戏平台推出“内容独占”的问题
- 工会心理咨询师基础培训班线上开课
- 投资者提问:能不能把你们网站建设一下,几个月都不更新了。该不会是没有内容来...
