1、程序是由什么组成的?
程序=逻辑+数据 (主要是由逻辑结构和算法数据组成的)
2、程序语言的执行方法:
c ——编译成——机器码(CPU能够直接执行的汇编语言)
Java ——编译成——字节码(Java自己能够看懂的语言)(Java虚拟机JDK为基础)——机器码(CPU执行)
Python ——编译成——字节码(Python虚拟机自己能够看懂的语言)——机器码(CPU执行)
——解释——(由安装的解释器进行解释)
shell ——解释——(/usr/bin/bash或者其他解释器进行解释)
编译型语言特点:执行快,更接近cup进行直接执行。缺点:修改的话比较麻烦
解释型语言特点:执行较慢,但是修改起来简单,即修即用。
3、脚本中的第一行例“#!/usr/bin/bash”为解释下面的代码是由bash解释的,不能省略。
4、shell脚本中可以插入其他解释型语言(好像只有shell支持这种插入)。
例:
#!/bin/bash
echo “hello bash”
/usr/bin/python <<-EOF //直接把需要插入的代码指明由什么解释器执行即可
print “hell python”
EOF
echo “hello bash”
5、shell脚本的两种执行方式:
bash 脚本文件 和 ./脚本文件 //这两种执行方法为:新开一个子shell环境,在其中执行 (执行不会影响当前shell)
source 脚本文件 和 . 脚本文件 //这两种执行方法为:在当前shell环境中执行 (执行会影响当前shell)
例:以下脚本就能更直观的区别出两种执行方式
#!/bin/bash
cd /home
ls
6、Linux中用户登录时所执行的shell “su - 用户名”登录的话则执行以下4个shell,所以会改变当前shell环境和当前目录
/etc/profile 和 /etc/bashrc 这两个shell是系统级的
~/.bash_porfile 和 ~/.bashrc 这两个shell是用户级的
若“su 用户名”登录的话,则仅仅只执行/etc/bashrc 和 ~/.bashrc 这两个shell 。所以“su 用户名”登录的话不会改变当前shell环境和当前目录
用户退出登录后所执行的shell
~/.bash_logout 和 ~/.bash_history 这两个shell是退出时所执行的
7、Linux中命令排序
; //只是单纯的把多个命令用分号隔开,可以同时写在一行上,前后命令互不干涉。(不具备逻辑判断)
&& //逻辑与;只有当前一个命令执行成功后,&&后面的命令才能执行。
|| //逻辑非;只有当前一个命令执行不成功后,||后面的命令才执行。
8、shell通配符(元字符)表示的不是本意
-
//匹配任意多个字符
? //匹配任意单个字符
[ ] //匹配括号中的任意一个单字符,[a-z] :表示只匹配一个英文字母,(centos7以上忽略字母的大小写了,即[a-z]表示匹配任意一个英文字母包括大写的。)
( ) //在子shell中执行括号中的命令,例(umask 077;touch 1.txt)不会影响当前shell环境的umask值,但是括号中的文件权限就会改变。
{ } //集合,例 touch {1…3}表示创建1.2.3三个文件。#cp -rv /etc/sysconfig/network-scripts/ifcfg-{ens33,ens36}表示复制一个网卡ifcfg-ens36
\ //转义符,在任何元字符前面加上转义符,即表示此元字符为普通字符。
9、echo 输出颜色文本;分为两种颜色文本:前景色,背景色
前景色:echo -e “\e[1;33m想要输出的文本\e[0m” 有“30m到37m”几个颜色
背景色:echo -e “\e[1;43m想要输出的文本\e[0m” 有“40m到47m”几个颜色
10、什么是shell变量?
用一个特定的字符串去表示不固定的内容
11、变量的类型:
1)自定义变量
定义变量: 变量名=变量值 (变量名必须以字母或下划线开头,区分大小写)
引用变量: $变量名 或 ${变量名}
查看变量: echo $变量名 set(所有变量:包括自定义变量和环境变量)
取消变量: unset 变量名
作用范围: 仅在当前shell中有效
PS:当我们在多个脚本中使用相同的自定义变量时;可以不用设置环境变量,只需要添加一个脚本文件
把需要使用的自定义变量放在其中。然后在需要使用这些变量的脚本中加载一下这个存放变量的脚本文件即可
例:文件path.sh中存放自定义变量,在脚本文件x.sh中需要使用path.sh中的变量,添加“source path.sh 或
. path.sh”即可使用其变量
2)环境变量
定义环境变量方法:方法一:export 变量名=变量值
方法二:export 自定义变量的变量名 (将自定义变量转换成环境变量)
引用环境变量: $变量名 或 ${变量名}
查看环境变量: echo $变量名 env (例 env |grep USER)
取消环境变量: unset 变量名
变量作用范围: 当前shell和子shell有效
3)位置变量
$1 $2 $3 $4 $5 ... ${10}
4)预定义变量
$0 所执行的脚本名称 (`basename $0` 只取脚本名称,不显示执行脚本的路径)
$* 所有的参数 (当成一个参数输出)
$@ 所有的参数 (所有参数分别输出)
$# 所有参数的个数
$$ 当前进程的pid号
$! 后台最后一个进程的pid号
$? 上一条命令执行后的状态,返回0为成功,非0表示不成功。
12、变量赋值的方式
1)显示赋值:
变量名=变量值
即:name=xy
shen=“175 cm”
time=date +%F
或 time=$(date +%F)
2)read 从键盘读入变量值:
read 变量名
read -p "提示信息:" 变量名
read -t 5 -p "提示信息:" 变量名 (5秒之内输入赋值)
read -n 3 变量名 (限制赋值为3个字节)
PS: “read 变量赋值”可以同时给多个变量赋值,例:read -p "请输入姓名,年龄,性别[xy 20 nan]: " name age sex
即可分别赋值给“name ”“age““ sex”三个变量,以空格进行分隔。
13、变量的引用
’ ’ // 强引用,单引号里面的元字符都会被看成普通字符,即变量不会被引用
" " // 弱引用,双引号里面的元字符都生效,即变量能够被引用
等价于 $( ) // 优先执行反撇号或者括号里面的命令,最终把里面的结果显示出来
14、变量的运算
1)整数运算:( + - * / % )
方法一:expr
expr 1 + 2
expr $num1 + $num2
sum=expr $num1 + $num2
方法二:$(( ))
echo $(($num1+$num2))
echo $((num1+num2))
echo $((5-3*3))
echo $(((5-3)*3))
echo $((2**3))
sum=$((1+1)); echo $sum
方法三:$[ ]
echo $[1+1]
echo $[2**3]
echo $[num1+num2]
sum=$[num1+num2]; echo $sum
方法四:let
let sum=1+1; echo $sum
let i++; echo $i
2)小数运算:
echo "scale=3; 10/3" |bc
echo "2^3" |bc
awk 'BEGIN {print 10/3}'
echo "print 10.0/3" |python
15、变量“值”的删除和替换 (仅在当前引用生效,不改变变量原有的值)
1)引用变量值的删除
# 格式:例KaTeX parse error: Expected '}', got '#' at position 6: {PATH#̲*:} //删…{PATH##*:} //删除从开头开始匹配,到最后一个“ :”为止的内容 (即最长匹配)
% 格式:例${PATH%:*} //删除从末尾开始匹配,到第一个“ :”为止的内容 (即最短匹配)
%% 格式:例${PATH%%:*} //删除从末尾开始匹配,到最后一个“ :”为止的内容 (即最长匹配)
2)引用想要的变量值 (索引及切片)
echo ${PATH:0:5} //只输出从第0个字符开始到第5个字符结束的内容
echo ${PATH:5:5} //输出从第5个字符开始,往后5个字符的内容
echo ${PATH:5} //输出第5个字符