Linux 总结(根据自身情况,建议动手敲敲,时间卡在一个上午)

来来回回兜兜转转,又回到了Linux的学习。。。。
大假期学习充电冲冲冲!!!

shell语言

一、概述与总结

shell是一个用c语言写的程序,它是用户与C语言之间的桥梁,是一种命令语言,也是一种程序设计语言。是一种应用程序,提供了一个界面,用户可以通过界面访问Linux内核的服务。Shell脚本(shell script),是一种为shell编写的脚本程序。

Shell环境:

1、Bourne Shell(/usr/bin/sh或/bin/sh/)

2、Bourne Again Shell(/bin/bash)

3、C Shell(/usr/bin/csh)

4、K Shell(/usr/bin/ksh)

5、Shell for Root(/sbin/sh)

在实际运用中多为Bash,也就是Bourne Again Shell(系统默认)使用时要特别标注

#!/bin/bash #!是告诉系统默认的编译器

程序创建中一般使用vi/vim,扩展名在Linux中 一般不用特别说明都指代是文本文件

运行代码的环境我们首先要到对应的目录中去:Linux中目录与文件有着严格的区分,与Windows不同,并且必要的时候给程序添加对应的执行权限

运行程序的两种方法:

1、作为可执行程序(前提添加了可执行的权限)

运行时要对文件进行标识文件前面加入 ./ + 文件名,而不是直接使用文件名,直接使用文件名的后果是Linux将从Path中寻找对应的环境变量,默认情况下环境变量中有/bin,/sbin, /usr/bin

2、作为解释器参数

这种方法是直接运行解释器,其参数就是shell对应的脚本名称(这种方法会忽略对应的文件中头一行写的解释器)

/bin/sh /bin/php

二、Shell 变量

定义变量名,必须要加美元符号,但是要切记变量名和等号之间不能有空格,且必须遵守对应的规则:

1、命名只能使用英文字母,数字和下划线(_)

2、中间不能含有空格,可以使用下划线

3、不能使用标点符号

4、不能使用对应的关键字

使用变量名:要在对应的变量前面添加$美元符号,里面可以恰当的添加()用来限定范围方便程序运行时使用

设置只读变量(readonly)。在规定的变量名字前加readonly

删除变量:使用unset命令可以删除变量,注意这个删除运算无法对只读的文件进行删除,只读变量的删除可以交给root用户或者关机

变量的类型:

1、局部变量:局部变量在脚本或者在命令中定义,仅在当前shell实例中有效,其他的shell启动的程序不能访问局部变量

2、环境变量:所有程序,包括shell启动的程序都能访问环境变量,有些环境变量是保证程序的正常运行,必要的时候可以在shell脚本中定义相应的环境变量

3、shell变量:是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些都是用来保证shell脚本的正常的运行

shell字符串

字符串可以用单引号也可以使用双引号,也可以不使用引号

单引号的限制:单引号的任何字符都会原样输出,单引号字符串中的变量是无效的。

双引号中可以存在变量与单引号不同并且可以出现转义字符。

注意shell里面的拼接与一般语言的拼接略有不同。

获取字符串的长度

使用$(#字符串名)

提取字符串中个别字符

$(字符名: 1:4 ) 从字符串的第二个字符开始截取到第四个字符

查找子字符串的位置

string=“runnoob is a great site”

echo `expr index “$string” io` #输出的结果是4

`是反引号 不是单引号

Shell数组

bash支持一维数组(不支持多维数组),并且没有限制数组的大小

在shell中,用括号来表示数组,数组的元素用“空格”符号分隔开。定义数组的一般形式为: 数组名=(值1 值2 值3 )

读取数组时,一般格式为 ${数组名[下标]}

获取数组长度 ${#数组名[@/*/n]}

Shell注释

单行:以#开头的就是注释,会被解释器忽略

多行:直接变成不使用的函数/多行注释的形式

:<

EOF

EOF为自取值,可以发生更改

三、Shell传递参数

脚本内获取参数的格式为:$n n代表一个数字 $0 代表文件名字 $1代表第一个参数…

(为没有执行权限的文件添加文件执行权限)

使用方法:执行文件的同时在执行文件的后面添加指定 加入参数 ./文件名 1 2 3

$# 传递到脚本的参数个数

∗ 以 一 个 字 符 串 显 示 当 前 所 有 向 脚 本 传 递 的 参 数 ( * 以一个字符串显示当前所有向脚本传递的参数( (@ 功能大似相同 不同的时$@ 返回的是不同的参数)

$$ 脚本运行的当前进程ID号

$! 后台运行的当前进程ID号

四、Shell基本运算符

原生bash不支持简单的数学运算,需要用其他命令来实现,awk、expr(这是最常用的)expr是一款表达式计算工具,使用它能完成表达式的求值操作,并且使用的时候要使用``(反引号包括起来)

注意:1、表达式和运算符之间要有空格, 2 + 2

​ 2、完整的表达式要被 `` 包含

算术运算符
运算符 说明 举例
+ 加法 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 为 10,变量 b 为 20:

运算符 说明 举例
-eq 检测两个数是否相等,相等返回 true。 [ $a -eq $b ] 返回 false。
-ne 检测两个数是否不相等,不相等返回 true。 [ $a -ne $b ] 返回 true。
-gt 检测左边的数是否大于右边的,如果是,则返回 true。 [ $a -gt $b ] 返回 false。
-lt 检测左边的数是否小于右边的,如果是,则返回 true。 [ $a -lt $b ] 返回 true。
-ge 检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
-le 检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。
布尔运算符
运算符 说明 举例
非运算,表达式为true 则返回为false,否则返回 true [ ! false ] 返回true
-o 或运算,有一个表达式为真 则返回结果为真 [ $a -lt 20 -o $b -gt 100 ] 返回为true
-a 与运算,有两个表达式都为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
字符串运算符
运算符 说明 举例
= 检测两个字符串是否相等,相等返回 true。 [ $a = $b ] 返回 false。
!= 检测两个字符串是否相等,不相等返回 true。 [ $a != $b ] 返回 true。
-z 检测字符串长度是否为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 ]
-d file 检测文件是否为目录 是—true [ -d $file ]
-f file 检测文件是否为文件 是—true [ -f $file ]
-r file 检查文件是否为可读 [ -r $file ]
-w file 检测文件是否可写 [ -w $file ]
-x file 检测文件是否可操作 [ -x $file ]
-s file 检测文件是否为空 [ -s $file ]
-e file 检测文件(或者目录)是否存在 [ -e $file ]

五、Shell echo命令

1、显示变量

read命令从标准输入中读取一行,并把输入行的每一个字段指定给shell变量

read name

echo “$name It is a test”

2、显示换行

echo -e “aaaas \n”

3、显示不换行

echo -c “\c”

4、显示结果定向至指定文件

echo “It is a test” > myfile

5、echo 不支持转义字符的使用

6、显示命令执行结果时,需要饭一字符

六、Shell printf命令

printf 与 echo 相似,不同的是printf拥有的处理文字格式比echo要多,但对于printf来说需要在文件后面添加 \n

%-10s %-2.2f 保留10个字符的位置 后面有2个字符位置

相对的转义序列

七、Shell test

用于检查某个条件是否成立,它可以进行数值、字符和文件

数值测试

参数 说明
-eq 等于则为真
-ne 不等于则为真
-gt 大于则为真
-ge 大于等于则为真
-lt 小于则为真
-le 小于等于则为真

字符串测试

参数 说明
= 等于则为真
!= 不相等则为真
-z 字符串 字符串的长度为零则为真
-n 字符串 字符串的长度不为零则为真

文件测试

参数 说明
-e 文件名 如果文件存在则为真
-r 文件名 如果文件存在且可读则为真
-w 文件名 如果文件存在且可写则为真
-x 文件名 如果文件存在且可执行则为真
-s 文件名 如果文件存在且至少有一个字符则为真
-d 文件名 如果文件存在且为目录则为真
-f 文件名 如果文件存在且为普通文件则为真
-c 文件名 如果文件存在且为字符型特殊文件则为真
-b 文件名 如果文件存在且为块特殊文件则为真

八、Shell 流程控制

shell的控制语句没有则不写,但是不能为空

if

if condition

then

​ command 1

​ commend 2

fi

写成一行 if [ $(ps -ef | grep -c “ssh”) -gt 1 ]; then echo “ true” ; fi

后面的 fi 是 if 倒过来的结构

if else

if condition

then

​ command 1

​ command 2

else

​ command 3

fi

一行式子:if [ ] ; then command 1;else [] ; fi

if else-if else

if condition

then

​ command 1

elif

​ condition

then

​ command 2

else

​ command 3

fi

一行式子:if condition then command 1 elif condition2 then command 2 else command 3 fi;

for 循环

for var in item1 item2 item3

do

​ command 1

​ command 2

done

一行式子:for var in item1 item2 …;do command 1 commend 2 done;

while 语句

while 循环用于不断执行一系列命令,也用于从输入文件中读取数据,通常被视为测试条件。

while condition

do

​ command

done

无限循环

while :

do

​ command

done

until 循环

until 循环执行一系列命令直至条件为true时 停止

until condition

do

​ command

done

返回为false时 才能继续解决

case

Shell case语句为多选择语句,一个case 语句匹配一个操作,如果匹配成功,则执行相匹配的文件

case 值 in

case $n in

​ 1) …

​ 2)…

​ …

​ *) 如果无一匹配模式,则使用 *) 捕获命令进行后续操作

​ ;;

esac

1|2|3|3) …

跳出循环

break 命令: 直接跳出当前循环

continue 命令:只能跳出当前的一次循环

case…esac

多分支选择结构

casein
模式1)
    command1
    command2
    command3
    ;;
模式2)
    command1
    command2
    command3
    ;;
*)
    command1
    command2
    command3
    ;;
esac

九、Shell函数

为用户定义函数,然后在shell脚本中进行使用

[ function ] funname [ () ]

{

​ action ;

​ [return int ; ]

}

简化形式:

domeFun(){

​ echo “ ”

}

带有返回值的函数

funWithReturn(){

​ echo

​ return $(( x 1 + x1+ x1+x2 ))

}

echo $? 函数返回值在调用该函数后通过 $? 来获取

函数参数

在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…

funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

当参数的个数大于10后, 获取参数的方法为${n}

十、Shell输入/输出重定向

一般的定向输入输出是键盘和显示器,重定向改变终端显示到固定的文件夹中

重定向命令列表如下:

命令 说明
command > file 将输出重定向到 file。
command < file 将输入重定向到 file。
command >> file 将输出以追加的方式重定向到 file。
n > file 将文件描述符为 n 的文件重定向到 file。
n >> file 将文件描述符为 n 的文件以追加的方式重定向到 file。
n >& m 将输出文件 m 和 n 合并。
n <& m 将输入文件 m 和 n 合并。
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入。

输出重定向

箭头方向取反

多个重定向:command < infile > outfile

执行命令command,从文件infile中读取数据,输出到outfile

般情况下,每个 Unix/Linux 命令运行时都会打开三个文件:

  • 标准输入文件(stdin):stdin的文件描述符为0,Unix程序默认从stdin读取数据。
  • 标准输出文件(stdout):stdout 的文件描述符为1,Unix程序默认向stdout输出数据。
  • 标准错误文件(stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息。

默认情况下,command > file 将 stdout 重定向到 file,command < file 将stdin 重定向到 file。

/dev/null 文件 执行文件 并将文件的结果返回给/dev/null相当于垃圾桶

十一、Shell 文件包含

简单来说 就是文件变量相互调用

你可能感兴趣的:(经验分享,和大家努力的每一天)