shell基础之01(脚本规则,变量名定义规范、变量种类)


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、一定要清楚自己写的脚本是交互还是非交互的!!
 交互 需要自己确认
 

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

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变量的赋值控制,主要练习或验证下列内容:
 

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

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 ~]#
 
 
 

猜你喜欢

转载自blog.csdn.net/Perfect11_1/article/details/81460155
今日推荐