Shell概述 & 简单编写执行 & 简单变量

一 . Shell概述

1.1 什么是Shell
在Linux内核与用户之间的解释器程序
–通常指向/bin/bash
–负责向内核翻译及传达用户/程序指令
–相当于操作系统的“外壳”

1.2 shell和bash区别
shell是一个抽象概念 包括许多解释器 例如:bash ksh tcsh等
bash是具体实现shell这种抽象的概念 是一种程序 一个明确的产品

1.3 常用的Shell程序种类

[root@shell ~]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

1.4 安装ksh解释器(ksh不支持快捷键)

[root@shell ~]# yum -y install ksh
[root@shell ~]# cat /etc/shells
/bin/ksh
/bin/rksh
[root@shell ~]# ksh ------>进入ksh环境
#exit
[root@shell ~]# usermod -s /bin/tcsh dan --------->dan的登录Shelk为/bin/tvsh

二 . Bash基本特性

1)快捷键

–ctrl + k 删除光标后面所有字符
–ctrl + l 清屏
–alt + r 撤消前一次动作
–alt + u 把光标当前位置单词变为大写
–alt + l 把光标当前位置单词变为小写
在这里插入图片描述

2)Tab键补齐

3)命令历史

默认记录1000条
–默认保存位置 : ~/.bash_history
–控制历史命令的数量 : /etc/profile
–HISTFILESIZE 指定历史文件的命令的存储条数
–HISTTIMEFORMAT="%F %T" 显示每条命令的具体执行时间

[root@shell ~]# grep ^HISTSIZE /etc/profile
HISTSIZE=1000 ------>全局设置的记录个数
[root@shell ~]# history -c #清空历史记录
[root@shell ~]# history -d 2 #删除第2条历史命令

4)命令别名

别名设置一半存放在用户的.bashrc文件内

[root@shell ~]# cat ~/.bashrc
alias rm=‘rm -i’
alias cp=‘cp -i’
alias mv=‘mv -i’
[root@shell ~]# unalias 别名 #取消单个别名
[root@shell ~]# unalias a #取消所有别名

5)标准输入输出
标准输入(stdin) 从该设备接受用户输入数据 描述号 0 使用<或<<
标准输出(stdout) 通过设备向用户输出数据 描述号 1 使用>或>>
标准错误(stderr) 通过该设备报告执行中出错信息 描述号 2 使用2>或2>>

6)重定向
在这里插入图片描述在这里插入图片描述

[root@shell ~]# chmod +x /root/cdx.sh
[root@shell ~]# /root/cdx.sh
[root@shell ~]# cat /root/user.log
useradd:用户“dan1”已存在
useradd:用户“dan2”已存在

7)管道操作

借助于管道操作 可以将一条命令输出交给另一条命令处理 在一条命令行内可依次使用多个管道

[root@shell ~]# who | wc -l
2 #统计有多少用户连接本机

三 . 简单Shell脚本设计

3.1 规范的Shell脚本构成包括
-脚本声明(需要的解释器 作者信息等)
-注释信息(步骤 思路 用途 变量含义等)
-可执行语句(操作代码)

3.2 编写一个简单的小脚本

3.2.1 在屏幕上输出一段文字“Hello Dan“

[root@shell ~]# cat dan.sh
#!/bin/bash
echo “Hello Dan”
[root@shell ~]# sh dan.sh
Hello Dan

3.2.2 编写为本机快速安装Yum仓库的脚本

[root@shell ~]# cat yum.repo
#!/bin/bash
rm -rf /etc/yum.repos.d/*.repo
echo ’
[dvd]
name=added
baseurl=ftp://192.168.4.254/rhel7
enabled=1
’ > /etc/yum.repos.d/rhel.repo
yum repolist
[root@shell ~]# chmod +x yum.repo
[root@shell ~]# ./yum.repo
dvd added 4,986
repolist: 4,986

3.2.3 编写快速安装vsftpd服务的脚本

[root@shell ~]# cat vsftpd.sh
#!/bin/bash
yum -y install vsftpd &> /dev/null
systemctl start vsftpd
systemctl enable vsftpd
[root@shell ~]# chmod +x vsftpd.sh
[root@shell ~]# ./vsftpd.sh

3.3 Shell脚本执行方式

1)作为“命令字” 指定脚本文件的路径 前提有x权限

[root@shell ~]# ./dan.sh #指定相对路径
[root@shell ~]# /root/dan.sh #指定绝对路径

2)作为”参数“ 使用bash sh source来加载脚本文件

[root@shell ~]# bash dan.sh #开启子进程
[root@shell ~]# sh dan.sh #开启子进程
[root@shell ~]# source dan.sh #不开启子进程

开启子进程与不开启的区别(只对少数脚本产生不同的影响)
[root@shell ~]# vim +46 /etc/profile
#光标直接定位到46行 修改历史命令HISTSIZE=50
在这里插入图片描述

四 . Shell变量

4.1 新建/赋值变量

只能使用“字母 数字 下划线”这三个表示 不能用数字开头

[root@shell ~]# dandan=xiannv
[root@shell ~]# set | grep dandan #使用set命令查看变量设置
dandan=xiannv
[root@shell ~]# echo $dandan #通过echo $变量名 可以输出变量值
xiannv
[root@shell ~]# unset dandan #取消自定义变量

4.2 使用位置变量与预定义变量
在这里插入图片描述

[root@shell ~] # ./location.sh one 1 2 abc qq 8 7

4.3 使用环境变量

/etc/profile 全局变量 对所有用户有效
~/.bash_profile 用户文件 仅对指定用户有效

[root@shell ~]# echo $USER $HOME $SHELL $UID
root /root /bin/bash 0

环境变量PS1表示Shell环境的一级提示符 即命令提示符(\u用户名 \h主机名 \W工作目录 \ $权限标识)

[root@shell ~]# echo $PS1
[\u@\h \W]$
[root@shell ~]# PS1=‘dd#’ #修改一级提示
dd#PS1=’[\u@\h \W]$ ’ #恢复原有提示

环境变量PS2表示二级提示符 出现在强制换行 at任务编辑等场合

[root@shell ~]# echo $PS2 #查看默认的二级提示符
[root@shell ~]# cd \ #强制换行
/root/
[root@shell ~]# PS2=’=>’ #手动修改二级提示
[root@shell ~]# cd \ #再次验证提示符效果
=>~
[root@shell ~]# PS2=’>’ #恢复原有设置

[root@shell ~]# env #查看所有环境变量
[root@shell ~]# set #查看所有变量(包括env能看到的)

五 . 变量的扩展应用

5.1 三种引号对变量赋值的影响

1)双引号的应用

使用双引号可以界定一个完整的字符串

[root@shell ~]# aa=dandan zui mei
bash: zui: 未找到命令…
[root@shell ~]# aa=“dandan zui mei”
[root@shell ~]# touch bb cc #创建两个文件
[root@shell ~]# touch “bb cc” #创建一个文件
[root@shell ~]# ls
bb cc
cc
bb

2)单引号的应用

界定一个完整的字符串 并且可以实现屏蔽特殊符号的功能

[root@shell ~]# kyrie=11
[root@shell ~]# echo ‘$kyrie’
$kyrie
[root@shell ~]# echo " $ kyrie "
11

3) 反撇号 ` 或 $() 的应用

可以将命令执行的标准输出作为字符串存储 因此称为命令替换

[root@shell ~]# tar -czf log-date +%Y%m%d.tar.gz /var/log
[root@shell ~]# ls
log-20190329.tar.gz
[root@shell ~]# tar -czf log-date +%F.tar /var/log
log-2019-03-29.tar
log-2019-03-29.tar

5.2 使用read命令从键胖读取变量

–read基本用法 执行后从会等待并接受用户输入(无任何提示的情况)并赋值给变量

[root@shell ~]# read aa
dandan zui keai
[root@shell ~]# echo $aa
dandan zui keai

为了不让用户不知所措 使用结合-p选项给出友好提示

[root@shell ~]# read -p “请赞美蛋蛋:” i
请赞美蛋蛋:meili
[root@shell ~]# echo $i
meili

5.3 stty终端控制显示

—将回显功能关闭(stty -echo)
—将回显功能恢复(stty echo)

[root@shell ~]# cat stty.sh
#!/bin/bash
read -p “请输入用户名:” username
stty -echo #关闭回显
read -p “请输入密码:” passwd
stty echo #恢复回显
echo “” #恢复回显后补一个空行
useradd “$ username”
echo “$ passwd” | passwd --stdin “$username”
[root@shell ~]# chmod +x stty.sh
[root@shell ~]# ./stty.sh
请输入用户名:daner
请输入密码:
更改用户 daner 的密码 。
passwd:所有的身份验证令牌已经成功更新。

5.4 使用export发布全局变量

—默认情况下 自定义的变量为局部变量 只在当前Shell环境中有效 而在子Shell环境中无法直接使用 若希望定义的变量能被子进程使用 可以使用export命令将其发布为全局变量 使用export发布时 只需指定变量名(可以有多个)即可 也可以通过export命令直接设置新的全局变量

[root@shell ~]# export a=111
[root@shell ~]# echo $a
111
[root@shell ~]# bash
[root@shell ~]# echo $a
111

猜你喜欢

转载自blog.csdn.net/Kyrie__/article/details/88900876
今日推荐