shell学习

解释器种类:sh tcsh tsh bash
修改解释器:usermod -s /bin/修改的解释器 用户名
grep caofan /etc/passwd #查看caofan用户的shell解释器
什么是shell脚本:提前将可执行的命令语句写入一个文件,在一个文件中写入python语句,需要python解释器去解释编译,就叫python脚本。

一:第一个简单的shell脚本

1:先创建一个脚本文件
1:mkdir -p /root/shell/day01 2:vim /root/shell/day01/1.sh 3:按a以后编辑 echo“hello world”
2:一般新创建的脚本文件没有执行的权限,需要赋予执行权限 chmod +x /root/shell/day01/1.sh
3:执行脚本文件/root/shell/day01/1.sh 或者切换到/root/shell/day01目录下1: cd /root/shell/day01 2: ./1.sh
在这里插入图片描述
规范脚本的构成:
#!脚本声明(使用那种解释器解释代码)
注释信息(步骤,思路,用途)以#开始的为注释信息
可执行语句
2:执行脚本的多种形式(例如脚本文件为/root/shell/day1/1.sh)

二:赋值

1:为需要为文件赋执行权限的脚本
方法1:绝对路径执行

/root/shell/day1/1.sh

2:相对路径执行

cd /root/shell/day1  
./1.sh

2:不需要文件有可执行的权限
1:打开sh,bash解释器,然后执行脚本文件,由于解释器具有执行权限,所以不需要为文件赋执行权限
sh 脚本文件名 会开启子进程
source 脚本文件名 不会开启子进程
两者的区别:在ssh(远程连接)下,退出的脚本文件执行的时候,bash ,sh 这种退出指的是退出当前子进程,source执行以后由于没有子进程,会默认退出当前远程连接。

三:变量

定义变量:以固定的名称,存放可能有变化的值
定义变量的格式:变量名=变量值
取消变量的格式:unset 变量名
再次命名前面的变量,之前变量被赋予的值会被覆盖
变量名可以是字母,下划线,不可以是数字开头

四:变量分类:

1:系统环境 (变量变量名通常大写,有操作系统进行维护)
1:常用环境变量:PATH 命令搜索路径 主要作用:命令搜索变量(执行命令(如ls)后计算机会在存放命令的所有路径下去找,找到了就执行,找不到就会报一个错误,当你把PATH设置为空时,由于没有了命令搜索变量,任何命令都会失效,此时可以重新打开一个终端命令行或把PATH的值改回去)

echo $PWD   #打印当前所在路径
echo $USER  # 打印当前用户
echo $UID   #打印当前用户的ID号
echo $HOME    #返回当前用户的家目录
echo $SHELL   #当前计算机使用的哪种shell

2:位置变量(bash内置变量,存储脚本执行时的参数)
2:位置变量
写一个增加用户houjiana并给这个用户添加密码123456的脚本文件

mkdir -p /root/shell/day01/
vi /root/shell/day01/useradd.sh
#! /bin/bash
#这是一个增加用户并给用户添加密码的脚本文件
useradd  "$1"  #输入的第一个变量为$1变量的值
echo "$2" | passwd --stdin  $1 #输入的$2作为结果给$1做密码
esc---- shift+: ----wq #退出保存
chmod +x /root/shell/day01/useradd.sh  #给文件赋予执行权限
/root/shell/day01/useradd.sh houjiana 123456  #执行脚本文件并给第一个变量赋值houjiana 第二个变量赋值123456

3:预定义变量(bash内置变量,可以调用,但不能赋值或修改)
3:预定义变量
用来保存脚本程序的执行信息,可以直接使用这些变量但是不可以直接为这些变量赋值

ls #执行一条正确的命令
echo $?  #查看上一条命令执行是否成功,查看输出结果,为0表示成功,非0表示上一条命令执行失败

执行其他预定义变量:
mkdir -p /root/shell/day01/
vi /root/shell/day01/预定义变量.sh
#! /bin/bash
#这是一条测试预定义变量的脚本文件
echo $0
echo $$
echo $#
echo $*
chmod +x /root/shell/day01/预定义变量.sh
/root/shell/day01/预定义变量.sh aa 12 bb 63

在这里插入图片描述

$0的输出结果为脚本的名称
$$结果为脚本启动的进程号,每次都不一样
$# 表示脚本参数个数
$*会完整显示输入的预定义变量

4:自定义变量(用户自己定义)

五:变量的扩展应用

1:多种引号的区别:
不使用引号表示每个可识别的字符都是一个变量,
“”双引号允许扩展,以$引用其他变量,使用双引号表示三个变量被当做一个整体
‘’单引号禁止扩展
单双引号都可以引用一个整体(例如touch"a b c" 和 touch’a b c’是一样的),两者的区别是双引号引用的变量会被识别出来是特殊符号,使用单引号以后会被当做普通字符串。

[root@localhost ~]# touch "a b c"
[root@localhost ~]# ll
总用量 8
-rw-r--r--. 1 root root    0 88 21:38 a b c
-rw-------. 1 root root 1676 717 00:00 anaconda-ks.cfg
-rw-r--r--. 1 root root 1704 717 00:06 initial-setup-ks.cfg
drwxr-xr-x. 3 root root   19 86 23:39 shell
drwxr-xr-x. 2 root root    6 717 00:07 公共
drwxr-xr-x. 2 root root    6 717 00:07 模板
drwxr-xr-x. 2 root root    6 717 00:07 视频
drwxr-xr-x. 2 root root   45 717 00:26 图片
drwxr-xr-x. 2 root root    6 717 00:07 文档
drwxr-xr-x. 2 root root    6 717 00:07 下载
drwxr-xr-x. 2 root root    6 717 00:07 音乐
drwxr-xr-x. 2 root root    6 717 00:07 桌面
[root@localhost ~]# touch 'a b c d'
[root@localhost ~]# ll
总用量 8
-rw-r--r--. 1 root root    0 88 21:38 a b c
-rw-r--r--. 1 root root    0 88 21:38 a b c d
-rw-------. 1 root root 1676 717 00:00 anaconda-ks.cfg
-rw-r--r--. 1 root root 1704 717 00:06 initial-setup-ks.cfg
drwxr-xr-x. 3 root root   19 86 23:39 shell
drwxr-xr-x. 2 root root    6 717 00:07 公共
drwxr-xr-x. 2 root root    6 717 00:07 模板
drwxr-xr-x. 2 root root    6 717 00:07 视频
drwxr-xr-x. 2 root root   45 717 00:26 图片
drwxr-xr-x. 2 root root    6 717 00:07 文档
drwxr-xr-x. 2 root root    6 717 00:07 下载
drwxr-xr-x. 2 root root    6 717 00:07 音乐
drwxr-xr-x. 2 root root    6 717 00:07 桌面
[root@localhost ~]# hi="world"
[root@localhost ~]# b='world'
[root@localhost ~]# echo "$hi"
world
[root@localhost ~]# echo '$b'
$b
通过实验发现单双引号都可以引用一个整体,两者不同的是,双引号如果有特殊符号,会被识别出来特殊符号,而单引号会被当做普通字符串处理。

``反引号(esc下面的键):反引号是把命令的执行结果作为变量的值

[root@localhost day01]# b=`cat /root/shell/day01/user.sh `
[root@localhost day01]# more user.sh 
#! /bin/bash
#这是一个新增用户并给用户添加密码的脚本文件
useradd "$1"
echo "$2" |passwd --stdin $1
[root@localhost day01]# echo $b
#! /bin/bash #这是一个新增用户并给用户添加密码的脚本文件 useradd "$1" echo "$2" |passwd --stdin $1*
[root@localhost day01]# c=$(more /root/shell/day01/user.sh )
[root@localhost day01]# echo $c
#! /bin/bash #这是一个新增用户并给用户添加密码的脚本文件 useradd "$1" echo "$2" |passwd --stdin $1

反引号一般是跟随命令一起出现,取得值不在于命令,在于命令的执行结果,与&()的作用是一样的。

read标准输入取值:
写一个可以直接一次性创建用户和密码的脚本文件

mkdir -p /root/shell/day01/
vi /root/shell/day01/read.sh
输入a
#!/bin/bash
#这是一个read测试shell脚本
read -p "请输入用户名字:" name     #定义一个用户的名字变量name
read -s -p "请输入用户密码:" -t 10 mima   #定义用户密码变量mima 加-s可以提高安全性,不显示输入密码 -t可以限制输入密码的时间,可以提高效率
useradd $name      #当有人执行这个脚本时,将创建的变量name添加为用户
echo "$mima"|passwd --stdin $name    #将定义的密码值作为name变量的passwd值
esc——shift+: wq #退出保存
chmod +x /root/shell/day01/read.sh    #赋予权限
/root/shell/day01/read.sh  #执行脚本

结果如下:
在这里插入图片描述
全局变量与局部变量:
局部变量:新定义的变量,默认只在当前shell环境中有效,无法在子shell环境中使用
例如:

x=3  #定义一个变量x,给他赋值3
echo $x  #输出定义x变量的值
sh   #进入sh
echo $x   #输出定义x变量的值

在这里插入图片描述
证明自己定义的局部变量只能在当前shell环境中使用,不能在子shell中用
全局变量:
定义的全局变量在当前shell以及子shell中都有用
全局变量的定义:

export x=11  #定义全局变量

六:shell中的运算

1:整数运算
1:用[整数 运算符 整数 ]或者((整数 运算符 整数))进行整数的加减乘除:

echo $[2+1]
echo $[10-8]
echo $[10*5]
echo $[10/5]
echo $[0.2*1.2]
echo $[1.2/0.2]
echo $((10+2))

在这里插入图片描述
2:用变量的方式进行整数加减乘除:

x=6 y=2
echo $[x+y]
echo $[x-y]
echo $[x*y]
echo $[x/y]
echo $[x%y]

在这里插入图片描述
3:用简便的方法来做运算:
在这里插入图片描述

x=3
echo $[x++]
echo $[x+=1]
echo $[x-=5]

4:用let命令也可以进行加减乘除

let x++
let x*=10
let x%=2
let i=2+3

2:小数运算
bc计算器
1:交互式bc计算器

1:检查电脑是否有bc计算器没有就安装一个
1:yum -y insatall bc
2:打开bc计算器
2:bc
3:输入要计算的小数算式

2:非交互式bc计算器

echo "1.8*2.3" |bc
echo "scale=3;1.8*2.4" |bc  #scale=n表示计算精确到小数点后几位,如果有多个运算式用;分开

3:比大小以及判断正确错误:

echo "5>2" |bc #判断5是否大于2并输入结果,1代表正确,0代表错误
echo "5==2"|bc #判断5是否等于2并输入结果,1代表正确,0代表错误

  • 20
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值