不出意外,应该是最后一篇Linux学习笔记,接下来半个月会对TensorFlow进行总结和案例解析。
shell是一个命令行解释器,它为用户提供了一个向Linux内核发送请求,以便运行程序的界面系统级程序,用户可以用shell来启动、挂起、停止甚至是编写一些程序。
直白的说,shell就是将应用程序解释给Linux内核听,Linux内核再驱动硬件进行一系列操作。不经过shell解释的程序,Linux是听不懂的。
脚本格式:
1、脚本必须以#!/bin/bash开头
2、脚本需要有可执行权限(使用chmod赋予权限)
用vim创建新文件,文件名以xxx.sh命名,表明是一个bashell文件。
脚本的常用执行方式:
1、输入脚本的绝对路径或者相对路径
用pwd显示当前的路径,如果脚本文件是在当前文件夹下,那么使用相对路径就可以执行该文件(前提是该文件有执行权限)。如果脚本文件不在该文件夹下,那么使用绝对路径也可以执行该脚本(仍旧要求执行权限)。
2、利用 sh 文件名 执行脚本文件
表示要将后边的文件以脚本文件来处理(此时可以不要求有执行权限,直接执行即可)。
shell中的变量
1、Linux中的shell变量分为系统变量和自定义变量,自定义变量用的更多;
2、系统变量通常为大写,如$HOME、$PWD、$SHELL、$UESR等,可以用echo 输出相应的内容;
3、显示当前shell中的所有变量:set 输入一个set即可查看所有的变量
定义变量
1、变量的定义可以由字母,数字,下划线组成,但是不能以数字开头。
2、等号两侧不能有空格。
3、变量名一般习惯大写,这是一个规范。
补充
1、变量名=值 如A=100(在shell中常用大写字母来定义变量)
2、撤销变量:unset 变量名 撤销该变量的使用
3、声明静态变量:readonly 变量名 静态变量只能被定义一次,而且不可以被撤销
在使用echo输出变量时,echo A=$A 与echo "A=$A"表示的含义是相同的。A加上$才表示是一个变量,若不加$,系统会默认为普通文本。如果是单引号,默认为字符串。
:<<! 内容 !表示多行注释。前后的:<<! 和 !最好都另起一行。
将命令的返回值赋给变量:
1、A=`date` 反引号,运行反引号里面的内容并把结果返回给A
2、A=$(date)等价于反引号
设置环境变量
在linux系统中,文件目录与其对应的功能是固定的,在/etc/profile文件中可以查看和定义新的环境变量。将一个变量定义为环境变量,该变量就会被多个shell文件所承认和允许,即在多个脚本文件中都可以直接调用该变量,而不用重新定义。
基本语法
1、export 变量名=变量值 (功能:将shell变量定义为环境变量,即全局变量)
2、source 配置文件 (功能:让修改后的配置信息立即生效。如果不运行该步骤,则shell脚本不能识别新的环境变量,即source /etc/profile)
3、echo $变量名 (查询环境变量的值,确认是否定义成功)
位置参数变量
当我们在执行脚本的时候,如果希望获取到命令行的参数信息,就可以使用到位置参数变量。
基本语法:
$n n为数字,$0表示命令本身,$1-9表示第一个到第九个参数,十以上的参数需要用到大括号包含${10}
$* 代表命令行中的所有参数,$*把所有的参数看成一个整体
$@ 代表命令函中的所有参数,不过$@把每个参数区别对待
$# 代表命令行中所有参数的个数
案例,创建myshell.sh脚本:
#!/bin/bash
echo "0=$0 1=$1 2=$2"
echo "所有的参数=$*"
echo "$@"
echo "参数的个数=$#"
保存该脚本文件,根据绝对或相对路径执行该脚本文件。
./myshell.sh 100 200
输出内容为:
第一行三个内容分别为$0$1$2
预定义变量
提前设计好的变量,可以在shell中直接使用
基本语法:
$$ 当前进程的进程号(PID)
$! 后台运行的最后一个进程的进程号
$? 最后一次执行命令的返回状态,如果返回0表示最后一个命令正确执行,如果返回其他值,证明上一个命令是不正确的
运算符
1、运算式的表达 “$((运算式))”、”$[运算式]“或者 expr m + n (expression表达式,注意m、n与运算符之间有空格)
2、如果希望将expr后的计算内容赋给某个变量,需要使用反引号``
3、expr \*,/,% 乘、除、取余
判断语句
语法 [ condition ] condition为需要判断的内容,且前后都需要有空格
非空返回true,可以用$?进行验证
[ zhou ] 返回true [ ] 返回false
常用的条件判断:
= 字符串的比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
-r 有读取权限
-w 有写入权限
-x 有执行权限
-f 文件存在且是一个常规文件
-e 文件存在
-d 文件存在且是一个目录
流程控制之if
If [ condition ]
then
执行
fi
if语句进行判别时,只有condition中的条件满足了才会执行then中的执行语句,如果不满足,则不做输出
多分支
If [ condition ]
then
代码
elif
代码
fi
fi表示代码执行的结束
流程控制之case
case $变量名 in
"值1"
执行部分(如果变量的值在值1中,执行该部分)
"值2"
执行部分
*)(如果变量的值不在以上任意一个范围中)
执行部分
esac
流程控制之for
for 变量 in 值1 值2 值3 …
do
程序/代码
done(运行结束)
或者
for ((初始值;循环控制条件;变量变化))
do
程序/代码
done
流程控制之while
while [ 条件判断式 ]
do
程序/代码
done
read 选项 参数
-p 指定读取值时的提示符
-n 指定读取值时的等待时间,如果没有在指定时间内输入就不再等待了
变量:指定读取值的变量名
在双引号后边必须有一个空格,表示将前边输入的数赋值给后边的NUM和num2,不加空格则不能完成赋值
-p表示会一直等待输入,如果不输入就会一直待在输入界面,-t则表示只等待一定时间。-t 数值 -p 空格不能缺少
函数介绍
两个内置函数的介绍
basename 返回完整路径最后/的部分,常用于获取文件名
basename [pathname][suffix] 删除文件路径的所有前缀包括最后一个/,只保留文件名,输出字符串
如basename /home/aaa/test.txt 只会返回test.txt
dirname 返回完整路径最后斜线/前面的部分,即除去文件名的所有路径
如dirname /home/aaa/test.txt 返回/home/aaa
自定义函数
[ function ] funname[()]
{
action;
[return int;]
}
在调用的时候直接写函数名加值
案例:
#!/bin/bash
function getsum()
{
SUM=$[$n1 + $n2]
echo "和=$SUM"
}
read -p "请输入N1=" N1
read -p "请输入N2=" N2
getsum $N1 $N2
注意事项:
1、函数都是小写的,变量一般设置为大写
2、运算符号前后要有空格
3、读取的输入变量和运算变量要一致