SHELL基础
语法
shell是人和计算机内核之间的中介
计算机的语言是二进制,把人类的翻译成计算机能够识别的语言,然后让内核来处理
内核完成齐后要把结果反馈给用户,要把计算机的翻译成人类能够识别的语言
shell脚本:扩建语言,或者是动态语言,是一种编程的语言。控制软件的应用程序,只要在被调用时,才会执行。
- 脚:把保存在文本当中代码执行起来
- 本:代码是保存在文本当中,特定条件(运行代码的条件)
shell脚本的作用
- 自动化运维
- 批量化重复操作可以通过脚本和计划任务来进行自行运行。
- 减轻了管理人员的工作量
- 避免配置出错
命令解释器
Windows中:
pycharm,idel,vscode
Linux中:
- bash:主流,也是现在市面上绝大多数的linux系统默认的shell
- csh:类C语言的shell
- tcsh:和csh类型,相当于升级版
- nologin 也是一种shell,禁止用户登录
shell脚本的结构
vim first.sh #默认以.sh为结尾的文件是脚本文件
#!/bin/bash
#声明的脚本默认解释器,这个可以不加,默认就是bash
#this is my first shell-script
#以"#"开头。表示当前的内容为注释内容,注释的内容是不会被运行的,写代码要养成写注释的习惯,方便其他人阅读和理解
#可执行语句: #所有的linux可执行的命令都可以是代码的内容
cd /boot
echo "当前所在的目录:"
#在shell当中的作用相当于打印,echo要打印的内容都是字符串,推荐使用双引号引来。
pwd
echo "展示其中以vml开头的文件:"
ls -lh vml*
-
调试模式
脚本没有权限的情况下的运行模式
bash 代码名:创建一个子shell环境,只在这个子环境当中运行,不会真正的执行代码运行结束,子环境也会退出。
sh 代码名
source 代码名:点命令 . 真正的运行可执行的代码。 -
赋权执行
在工作中所有的脚本都是赋权执行的
chmod 777 代码名
./代码名
/yopt/代码名 -
定时任务执行
脚本必须要是绝对路径(也需赋权)
crontab -e
重定向
就是把这些信息保存到指定的文件当中去
这些信息:标准输入,标准输出,标准错误输出
-
重定向输入
passwd --stdin dn < passwd.txt #用户从passwd.txt获取密码 -
重定向输出:
-
> 只能把标准输入保存到文件当中去,如果原文有内容会直接覆盖
-
>> 标准输出保存到文件当中去,不会覆盖原内容,而是在原内容之后追加。
- 重定向错误输出
- 2> 将错误信息保存到指定的文件,文件当中的内容也会被盖。
- 2>> 将错误信息保存到指定的文件,文件当中的内容不会被覆盖而是在行后追加
- 混合输出
- &> 将标准输出、标准错误保存到同一文件中,覆盖原内容
- &>> 将标准输出、标准错误保存到同一文件中,文件当中的内容不会被覆盖而是在行后追加
变量
用来存放系统和用户需要使用的特定的参数
-
变量名:系统定义好的,每个用户都可以使用(全局变量)一般情况下是不可以修改的
-
自定义变量:要是用户定义的名称和名称对应的参数(值)
自定义变量名
- 不要使用系统的命令作为变量名称
- 不要使用中文
- 变量名不能使用特殊符号开头,可以使用下划线“_"开头
- 定义变量时一定要是字母开头,不能以数字开头
- 变量名最好是对应名称的英文全称或者简写
变量值
int------整数,没有小数点
string------字符串 字母或者数字组成,会用引号引起来
布尔------true false 为真还是为假(一般条件判断的返回值)
浮点------1.23
打印变量
echo $变量
root@u3:/opt# a=1086
root@u3:/opt# echo $a
1086
echo “${变量}打印内容”
root@u3:/opt# echo "${a}按按"
1086按按
read -p "提示信息" a
#read:根据用户输入直接赋值给变量 -p “ ”
固定格式 a变量名
echo $a
root@u3:/opt# vim first.sh
read -p "a=" a
read -p "b=" b
echo $a $b
root@u3:/opt# bash first.sh
a=10
b=20
10 20
强引用和弱引用
- “ ”:弱引用,打印变量时,加上双引号就是变量的值
- ’ ':强引用,打印变量时,就是字符串的本身。不再代表变量对应的值
变量的作用范围
- 全局变量(主要是系统定义的,不能改的)
在全局配置文件当中修改,export 变量名=值,所有用户都可以使用
如果有需要一直不变的参数可以供所有人使用,就可以配置全局变量
副作用:一旦有改动,增加了复杂性
root@u3:/opt# vim first.sh
echo $a $b
root@u3:/opt# vim /etc/profile
#自定义全局变量
export a=1
export b=2
root@u3:/opt# source /etc/profile
root@u3:/opt# bash first.sh
1 2
- 环境变量(也是全局变量的一种),系统创建的,设置用户的工作环境
由系统维护,一般用户是不去修改的,让所有人都可以自动识别到(自动补齐)
env #查看所有预设变量
echo $USER #当前登录的用户
echo $HOME #当前用户的家目录
echo $PATH #查看当前的搜索路径,这些目录下的文件可以在任意地方识别到,自动补齐
chmod 777 /opt/文件
PATH="$PATH:/opt" #添加让系统自动识别
root@u3:/opt# echo $PATH
/usr/local/sbin: /usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin: /usr/games: /usr/local/games: /snap/bin: /op
- 位置变量(脚本外传参)
root@u3:/opt# vim first.sh
a=$1
b=$2
echo $a $b
root@u3:/opt# bash first.sh
root@u3:/opt# bash first.sh 10 20
10 20
- 预定义变量(全局变量的一种,脚本解释器提供的,或者是编程语言自带的,不能修改)
- $*
- $@
$*与$@表示命令或者脚本需要处理的参数,区别在于处理的方式不同
区别
$*,会把传入的参数当做一个整体来进行处理,不加双引号和$@是一样的,都是一个个处理
$@,加不加双引号,都会把参数一个一个的处理
root@u3:/opt# vim first.sh
abc() {
for i in "$@"
do
echo "$i"
done
}
abc "hello" "world" "!"
root@u3:/opt# bash first.sh
hello world !
root@u3:/opt# vim first.sh
abc() {
for i in $@
do
echo "$i"
done
}
abc "hello" "world" "!"
root@u3:/opt# bash first.sh
hello
world
!
- $#:记录传递给脚本参数的个数
root@u3:/opt# vim first.sh
echo "输入了多少个数:$#"
root@u3:/opt# bash first.sh 1 2 3 4 5 6 7 8 9
输入了多少个数:9
- $?:记录的上一次执行命令的返回码,用来判断上一次执行的命令是否成功
0和非0
只有0表示上一次的命令执行成功,其他的都是失败
变量的运算
整数运算
#整数运算
运算符
+
-
*
/
% 取余
$(())
root@u3:/opt# vim first.sh
a=1
b=2
c=$(($a+$b))
echo $c
root@u3:/opt# bash first.sh
3
root@u3:/opt# vim first.sh
c=$((2+3))
echo $c
root@u3:/opt# bash first.sh
5
expr
root@u3:/opt# vim first.sh
i=$(expr 2 \* 5) #expr乘法需 \*
echo $i
root@u3:/opt# bash first.sh
10
let
root@u3:/opt# vim first.sh #let
let i=100*10
echo $i
root@u3:/opt# bash first.sh```
```css
i++ 都是表示自增1 i=i+1 先赋值再加 i=0 i=1+1 自增2 i+=2
++i 先加,再赋值i=0 i=0+1
i-- 表示i自减1 i=i-1 i-=2
--i
非整数运算
bc
bash 默认不支持小数运算
命令行:echo 4.4*4.4 | bc
vim:
root@u3:/opt# vim first.sh
num=$(echo "4.4+4.4" | bc)
echo $num
root@u3:/opt# dash first.sh
8.8
awk
root@u3:/opt# vim first.sh
num=$(awk 'BEGIN{print 4.45*1.2}')
echo $num
root@u3:/opt# bash first.sh
5.34