您的位置:首页 > 运维架构 > Shell

Shell概述 编写及执行脚本 、 Shell变量

2018-06-29 09:02 281 查看

SHEEL DAY1

[root@room4pc09 桌面]# cat /etc/shells
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh

清空已记录的历史命令。
[root@svr5 ~]# history -c //清空自己的历史命令
[root@svr5 ~]# > ~/.bash_history //清空记录文件
[root@svr5 ~]# history //再次检查历史命令列表
42 > ~/.bash_history
43 history

清屏幕:或clear

bash执行脚本中的文件

一定要清楚自己写的脚本是交互还是非交互的!!
交互 需要自己确认

Ctrl+A 跳到命令行开头
Ctrl+E 跳到命令行结尾

Ctrl+z 不能在Linux中用

!+(最近用过的文件的关键词或history中的编号)
eg: !vim
!cat

history -c(clear) 清空历史 默认1000条
vim /etc/profile
HISTSIZE=(50-100条就够用了)

别名(要有意义一些,否则不好识别)
直接在命令行输入alias 你好=‘ls’
命令+选项 ===alias

输出 重定向
正确1 默认屏幕
错误2 默认屏幕
ls > a.log 有正确的东西,a.log里面才会有内容

ls &>

firefox &

for(循环) i in {.....}

/dev/null 垃圾站

是覆盖 >>追加

scp

clone-vm7 (可安装1-10个虚拟机)
init5 字符界面变成图形界面

写脚本步骤:
bash test.sh
1.新建文件,扩展名最好是sh
2.写内容
一行必须是#!/bin/bash
下面的所有 指令都在/bin/bash下——定解释器
#都不会被执行,是注释信息
3.执行脚本
1)有权限的 rwx

eg : ./test.sh ./只显示当前目录下的文档
chomod +x test.sh 添加执行权限

PATH=路径 ls在PATH里面找路径
ln -s /root/test.sh /bin/abc
--symbolic符号 make symbolic links instead of hard linksq

2)无权限的
bash 文件名 会开启子进程(子进程执行) 执行完,自动退出
source 文件名 不会开启子进程 (当前执行)
eg:同时开启两个窗口
写脚本,sleep 100
(1)bash test.sh 或 source test.sh
另一个窗口执行:pstree
(2)bash text.sh 脚本写exit
sshd--bash--bash--exit
source test.sh
sshd--bash--exit
echo $a

)Shell脚本的执行方式:

方法一,作为“命令字”:指定脚本文件的路径,前提是有 x 权限

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

方法二,作为“参数”:使用bash、sh、source或者点号 . 来加载脚本文件

[root@svr5 ~]# bash   first.sh                        //开启子进程
[root@svr5 ~]# sh        first.sh                        //开启子进程
[root@svr5 ~]# source first.sh                        //不开启子进程
[root@svr5 ~]# .        first.sh                        //不开启子进程

ps与pstree(进程树)
查询文件在哪 eg:which+bash

ftp://192.168.4.254

练习(在虚拟机上配置)

自己搭建yum源,file,ftp,http
mount -o loop 光盘.iso /var/ftp/pub

1)#!/bin/bash
rm -rf /etc/yum.repo.d/*
echo "[abc]
name=added from: http://192. 168.4.254/rh7dvd
baseurl=http://192.168.4.254/rh7dvd
enabled=1
gpgcheck=0" > /etc/yum.repo.d/abc.repo
yum clean all
yum repolist

2)#!/bin/bash
rm -rf /etc/etc/yum.repo.d/*
yum-config-manager ....
echo "gpgcheck=0" >> 文件
yum clean all
yum repolist

ftp /var/ftp/
http /var/www/html/

无vim时 可用vi

win.iso > 4G 删除后不会存放在Trash中,太大

自动配置yum源
yum -y install vsftpd
systemctl start vsftpd
systemctl enable vsftpd

1.自动完成
2.出错0
3.防止步骤的丢失

变量名=变量值

注意:
1.等号两边不能有空格
2.变量名【字母,数字,下划线_,不能包含特殊符号,不能以数字开头】
3.如变量名已经存在,同名变量会被覆盖

调用变量 $名称
a=1
echo ${a}RMB 相当于(1+2)*2 有歧义就加个{}
1RMB

写脚本--测试---完成
备份

SHEEL 弱类型的脚本语言

env 列出所有的环境变量
set 包含所有的变量 使用set可查看所有变量(包括env能看到的环境变量)

系统自带的都是大写的

PS1 定义的是命令提示符
PS2 二级提示符

vim test.sh
echo $0 文件名字
echo $1 第一个参数
echo $2 第二个参数
echo $3 第三个参数
echo $* 所有的参数
echo $# 已加载位置变量个数
echo $? 上一个程序的是否成功

useradd tom
echo "12345" | passwd --stdin tom

写一个脚本,根据用户需求,来自动创建用户密码
#!/bin/bash
useradd $1
echo "$2" | passwd --stdin $1

写脚本,根据用户需求创建n个用户,初始密码都是123456
./text.sh tom janny lily

for i in $*
useradd

$0 $1 $2 $* $# 系统默认
echo $? 上一个命令是否成功 (0表示成功,1或其他值表示失败)

for循环语句

源码安装
tar xf
echo $?
./configure
make
make install

$$ 当前进程的进程号

echo $$ > /var/run/test.pid
sleep 1000

重点

重定向
管道

变量(自定义,系统)
keyname=value

1.系统自带 HOME PATH USER PWD UID
$0 $1 $2 $3 .... $* $# $?

2.自定义 a=1
思维过程
ps aux | grep test.sh

rpm -q(-query 询问) vsftpd

2)使用环境变量

当前用户的环境变量USER记录了用户名、LOGNAME记录了登录名、HOME记录了宿主目录、SHELL记录了登录Shell、HOSTNAME记录主机名、TERM记录终端类型:

[root@svr5 ~]# echo $USER $LOGNAME $HOME $SHELL
root root /root /bin/bash
[root@svr5 ~]# echo $HOSTNAME
svr5.tarena.com
[root@svr5 ~]# echo $TERM
xterm

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

[root@svr5 src]# echo $PS1                  //查看默认的一级提示
[\u@\h \W]\$
[root@svr5 src]#PS1='bash-3.2\$'          //修改一级提示
bash-3.2#                                  //更改结果
bash-3.2#PS1='[\u@\h \W]\$ '              //恢复原有设置
[root@svr5 src]#

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

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

  \d :代表日期,格式为weekday month date,例如:"Mon Aug 1"
  \H :完整的主机名称。例如:我的机器名称为:fc4.linux,则这个名称就是fc4.linux
  \h :仅取主机的第一个名字,如上例,则为fc4,.linux则被省略
  \t :显示时间为24小时格式,如:HH:MM:SS
  \T :显示时间为12小时格式
  \A :显示时间为24小时格式:HH:MM
  \u :当前用户的账号名称
  \v :BASH的版本信息
  \w :完整的工作目录名称。家目录会以 ~代替
  \W :利用basename取得工作目录名称,所以只会列出最后一个目录
  # :下达的第几个命令
  \$ :提示字符,如果是root时,提示符为:# ,普通用户则为:$

中英文转换
#LANG=zh_CN.UTF-8

4 案例4:变量的扩展应用
4.1 问题

本案例要求进一步熟悉Shell变量的赋值控制,主要练习或验证下列内容:

三种引号对赋值的影响
使用read命令从键盘读取变量值
使用export发布全局变量

4.2 步骤

实现此案例需要按照如下步骤进行。

步骤一:三种引号对变量赋值的影响

1)双引号的应用

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

[root@svr5 ~]# SCHOOL=Tarena IT Group
-bash: IT: command not found                      //未界定时赋值失败
[root@svr5 ~]# SCHOOL="Tarena IT Group"          //界定后成功
[root@svr5 ~]# touch aa bb                      //创建了两个文件
[root@svr5 ~]# touch "aa bb"                    //创建了一个文件
[root@svr5 ~]# ll                                //查看结果

2)单引号的应用

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

[root@svr5 ~]# NOTE='当前的用户是:$USER'
[root@svr5 ~]# echo $NOTE
当前的用户是:$USER                              //单引号内的 $ 被视为普通字符

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

使用反撇号或$()时,可以将命令执行的标准输出作为字符串存储,因此称为命令替换。

[root@svr5 ~]# tar -czf log-`date +%Y%m%d`.tar.gz /var/log

步骤二:使用read命令从键盘读取变量值

1)read基本用法

执行后从会等待并接受用户输入(无任何提示的情况),并赋值给变量str:

[root@svr5 ~]# read str
What's happen ?                          //随便输入一些文字,按Enter键提交
[root@svr5 ~]# echo $str                  //查看赋值结果
What's happen ?

为了不至于使用户不知所措、莫名其妙,推荐的做法是结合-p选项给出友好提示:

[root@svr5 ~]# read -p "请输入一个整数:" i
请输入一个整数:240
[root@svr5 ~]# echo $i
240

2)stty终端显示控制

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

可参考下列操作创建一个测试脚本:

[root@svr5 ~]# vim sttyecho.sh              //创建一个测试脚本
#!/bin/bash
read -p "localhost login: " USERNAME          //读取用户名
stty -echo                                  //关闭回显
read -p "Password: " PASSWORD              //读取密码
stty echo                                  //恢复回显
echo ""           //恢复回显后补一个空行
echo "Your login name is: $USERNAME"          //确认赋值结果
echo "Your password is: $PASSWORD"          //确认赋值结果
[root@svr5 ~]# chmod +x sttyecho.sh          //添加执行权限

执行测试脚本sttyecho.sh,验证效果:

[root@svr5 ~]# ./sttyecho.sh
localhost login: root                      //输入root,回车
Password:                                  //输入1234567(不会显示),回车
Your login name is: root                  //脚本反馈结果
Your password is: 1234567

步骤三:使用export发布全局变量

默认情况下,自定义的变量为局部变量,只在当前Shell环境中有效,而在子Shell环境中无法直接使用。比如已定义的SCHOOL变量,当进入到sh或bash子Shell后,变量SCHOOL将处于未定义的状态:

[root@svr5 ~]# echo $SCHOOL
Tarena IT Group
[root@svr5 ~]# sh                          //开启一个sh子进程
sh-3.2# echo $SCHOOL                          //查看SCHOOL变量值无结果
sh-3.2# exit                              //返回原有Shell环境
exit
[root@svr5 ~]# bash                          //开启bash子进程
[root@svr5 ~]# echo $SCHOOL                  //查看SCHOOL变量值无结果
[root@svr5 ~]# exit                          //返回原有Shell环境
exit
[root@svr5 ~]#

若希望定义的变量能被子进程使用,可以使用export命令将其发布为全局变量。使用export发布时,只需指定变量名(可以有多个)即可,也可以通过export命令直接设置新的全局变量:

[root@svr5 ~]# export SCHOOL                      //发布已定义的变量
[root@svr5 ~]# export XX="1234"                  //发布新变量
[root@svr5 ~]# NSD="Network&System Direction"
[root@svr5 ~]# export NSD YY="5678"              //混合式发布

验证刚刚发布的全局变量:

[root@svr5 ~]# sh                              //进入sh子Shell环境
sh-3.2# echo $SCHOOL                          //查看全局变量的值 .. ..
Tarena IT Group
sh-3.2# echo $NSD
Network&System Direction
sh-3.2# echo $XX $YY
1234 5678
sh-3.2# exit                                  //返回原有Shell环境
exit
[root@svr5 ~]#

若要取消全局变量的全局属性,可结合export命令的 -n 选项;若要取消变量,则应使用unset命令。比如,以下操作可将前面发布的SCHOOL、XX恢复成局部变量:

[root@svr5 ~]# export -n SCHOOL XX          //取消全局变量属性
[root@svr5 ~]# echo $SCHOOL $XX              //局部变量SCHOOL、XX仍可用
Tarena IT Group 1234
[root@svr5 ~]# sh
sh-3.2# echo $SCHOOL $XX                      //全局变量SCHOOL、XX已不可用
sh-3.2# exit                                  //返回原有Shell环境
exit
[root@svr5 ~]#

真机yum(loop循环)

40 mkdir -p /var/www/rh7dvd
41 mount -o loop /ISO/rhel-server-7.2-x86_64-dvd.iso /var/www/rh7dvd
42 yum-config-manager --add-repo http://192.168.4.254/rh7dvd
43 vim /etc/yum.repos.d/192.168.4.254_rh7dvd.repo
44 yum clean all
45 yum repolist
46 cd
47 cd /etc/yum.repos.d/
48 ls
49 rm -rf ISO_rhel-server-7.2-x86_64-dvd.iso.repo
50 mkdir -p /var/www/html/rh7dvd
51 umount /var/www/rh7dvd/
52 mount -o loop /ISO/rhel-server-7.2-x86_64-dvd.iso /var/www/html/rh7dvd/
53 yum clean all
54 yum repolist

虚拟机yum
yum-config-manager --add-repo http://192.168.4.254/rh7dvd
vim /etc/yum.repo.d/192.168.4.254_rh7dvd.repo
yum clean all
yum repolist

挂在光盘
mkdir /mnt //创建挂在点
mount /dev/cdrom /mnt //挂载设备
yum-config-manager --add-repo file:///mnt/
vim /etc/yum.repo.d/*
yum clean all
yum repolist

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  shell 变量