1、[root@room4pc09 桌面]# cat /etc/shells ------------------查看所有的shell解释器
/bin/sh
/bin/bash
/sbin/nologin
/usr/bin/sh
/usr/bin/bash
/usr/sbin/nologin
/bin/tcsh
/bin/csh
2、清空已记录的历史命令。
[root@svr5 ~]# history -c ----------清空自己的历史命令
[root@svr5 ~]# > ~/.bash_history --------清空记录文件
[root@svr5 ~]# history ----------再次检查历史命令列表
3、一定要清楚自己写的脚本是交互还是非交互的!!
交互 需要自己确认
4、写脚本步骤:
bash test.sh
1.新建文件,扩展名最好是sh
2.写内容
第一行必须是#!/bin/bash
下面的所有 指令都在/bin/bash下——指定解释器
#都不会被执行,是注释信息
3. 添加执行权限
chomod +x test.sh
5、无权限的脚本
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
6、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 --------------不开启子进程
8、自己搭建yum源,file,ftp,http
mount -o loop 光盘.iso /var/ftp/pub
1)#!/bin/bash-------------------搭建yum源
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---------另一种搭建yum源的方法
rm -rf /etc/etc/yum.repo.d/*
yum-config-manager ....
echo "gpgcheck=0" >> yum仓库配置文件
yum clean all
yum repolist
9、变量名=变量值
注意:
1.等号两边不能有空格
2.变量名【字母,数字,下划线_,不能包含特殊符号,不能以数字开头】
3.如变量名已经存在,同名变量会被覆盖
调用变量 $名称
a=1
echo ${a}RMB 相当于(1+2)*2 有歧义就加个{}
10、SHEEL 弱类型的脚本语言
env 列出所有的环境变量
set 包含所有的变量 使用set可查看所有变量(包括env能看到的环境变量)
系统自带的都是大写的
PS1 定义的是命令提示符
PS2 二级提示符
11、vim test.sh
echo $0 文件名字
echo $1 第一个参数
echo $2 第二个参数
echo $3 第三个参数
echo $* 所有的参数
echo $# 已加载位置变量个数
echo $? 上一个程序的是否成功
12、写一个脚本,根据用户需求,来自动创建用户密码
#!/bin/bash
useradd $1
echo "$2" | passwd --stdin $1
$0 $1 $2 $* $# 系统默认
echo $? 上一个命令是否成功 (0表示成功,1或其他值表示失败)
13、$$ 当前进程的进程号
14、变量(自定义,系统)
keyname=value
1.系统自带 HOME PATH USER PWD UID
$0 $1 $2 $3 .... $* $# $?
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]\$ ' -----------恢复原有设置
环境变量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
15、案例4:变量的扩展应用
4.1 问题
本案例要求进一步熟悉Shell变量的赋值控制,主要练习或验证下列内容:
4.2 步骤
实现此案例需要按照如下步骤进行。
步骤一:三种引号对变量赋值的影响
1)双引号的应用
使用双引号可以界定一个完整字符串。
[root@svr5 ~]# SCHOOL=Tarena IT Group
-bash: IT: command not found -----------未界定时赋值失败
[root@svr5 ~]# SCHOOL="Tarena IT Grou------------界定后成功
[root@svr5 ~]# touch aa bb ------------创建了两个文件
[root@svr5 ~]# touch "aa bb" -----------创建了一个文件
[root@svr5 ~]# ll-----------------查看结果
2)单引号的应用
界定一个完整的字符串,并且可以实现屏蔽特殊符号的功能。
[root@svr5 ~]# NOTE='当前的用户是:$USER'
[root@svr5 ~]# echo $NOTE
当前的用户是:$USE---------------单引号内的 $ 被视为普通字符
3)反撇号或$()的应用
使用反撇号或$()时,可以将命令执行的标准输出作为字符串存储,因此称为命令替换。
[root@svr5 ~]# tar -czf log-`date +%Y%m%d`.tar.gz /var/log
\ 把它右边的符号屏蔽掉
范例:
[root@localhost test]# a=12
[root@localhost test]# echo "\$a RMB"
$a RMB
[root@localhost test]# echo "\$a $a $a $a"
$a 12 12 12
[root@localhost ~]# mkdir test
[root@localhost ~]# cd test
[root@localhost test]# touch "a b c"--------创建一个叫a b c的文件
[root@localhost test]# ls
a b c
[root@localhost test]# rm -rf a b c--------删除a文件 b文件 c文件,因为没有所以什么都没有删除
[root@localhost test]# ls
a b c
[root@localhost test]# rm -rf "a b c"
[root@localhost test]# ls
步骤二:使用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
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
若希望定义的变量能被子进程使用,可以使用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 ---------------查看全局变量的值 .. ..
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 ~]#