zoukankan      html  css  js  c++  java
  • 【Shell】Shell编程基础

    从个人的测试岗位面试经历中看,百分之八九十的面试官都会问“熟悉哪些Linux命令?会写Shell脚本吗?”

    常用的Linux命令一般都能答上几个,但如果面试官问的太具体参数的用法,回答的时候会有点心里没底;Shell脚本就更不用说了,基本没动手写过。

    为了能更好的适应工作,后续会学习Linux&Shell相关的知识,不定期更新到博客园,以便记录、回顾。

     

    1.Shell变量 

    从变量的实质上来说,变量名是指向一片用于存储数据的内存空间。

    Shell变量是一种弱类型的变量,即声明变量时不需要指定其变量类型,也不需求遵循“先声明再使用”的规定,想用即可用。

    2.命名规范、变量赋值、变量取值、取消变量

    2.1 变量名命名规范:

    2.2.1 由英文字母、数字、下划线组成,不能以数字开头

    2.2.2 区分大小写

    2.2.3 不能使用bash的关键字--疑问:怎么查看bash的所有关键字?

    2.2 变量赋值:

    2.1.1 var_name1=studing               #变量名=变量值,=两边无空格

    2.1.2 var_name2='shell studing'     #变量值中有空格时必须使用引号括起,单、双引号都可以

    2.1.3 var_name3="$var_name1"  或 var_name3=$var_name1   #如果变量值引用的是其他变量,则不能使用单引号括起

    [root@testserver ~]# var_name1=studing
    [root@testserver ~]# var_name2='shell studing'
    #var_name3引用var_name1的值
    [root@testserver ~]# var_name3=$var_name1 [root@testserver ~]# echo $var_name3 studing [root@testserver ~]# var_name3='$var_name2' [root@testserver ~]# echo $var_name3 $var_name2 [root@testserver ~]# var_name3="$var_name2" [root@testserver ~]# echo $var_name3 shell studing [root@testserver ~]#

    2.3 变量取值:变量名前加$,如$var_name 或 ${var_name},两种方式都可以,推荐使用${var_name}

    2.4 取消变量:将变量从内存中释放,语法:unset 变量名/函数名

    [root@testserver ~]# echo $var_name3
    shell studing
    [root@testserver ~]# unset var_name3
    [root@testserver ~]# echo $var_name3

    [root@testserver ~]#

     

    3.局部变量、环境变量

    3.1 局部变量

    其作用域只在声明它的Shell中,对其他Shell无效。每个Shell有自己的变量空间,彼此互不影响。

    例如:打开两个Shell窗口,如下图:

     

    3.2 环境变量:即全局变量。

    使用export命令将当前Shell的变量导出为环境变量,可用于子Shell继承、使用。子Shell、父Shell切换方法:在当前Shell中输入bash并回车,即进入了子Shell;在子Shell中输入exit即退出子Shell返回到父Shell。

    export命令语法:export VAR=value #VAR变量名,value值,等号两边无空格

    从如下示例中,可以看出:环境变量可从父Shell传给子Shell,但子Shell的环境变量不能传给父Shell

    步骤:

    1.登录Shell,即为父Shell,输入bash进入子Shell

    2.=两边有空格,执行命令报错

    3.在子Shell中定义变量VAR,并导出为环境变量

    4.输入bash进入子Shell的子Shell,可称为孙Shell

    5.输出子Shell中定义的变量VAR

    6.输入exit退出孙Shell

    7.输入exit退出子Shell

    8.在父Shell中输出子Shell中定义的变量VAR,为空

     

     

     

     

     

     

     

     

     

     

    4.常见的bash预设环境变量

    变量BASH:Bash Shell的全路径

    [root@testserver ~]# echo $BASH
    
    /bin/bash

    变量BASH_VERSION:Bash Shell的版本

    [root@testserver ~]# echo $BASH_VERSION 
    4.1.2(2)-release

    变量CDPATH:用于快速进入某个目录。

    示例:如/usr/local/shell_studying/test_shell目录,每次进入test_shell目录需输入很长的路径。定义变量CDPATH='/usr/local/shell_studying/',执行cd test_shell时在当前目录查找是否有该目录,没有则进入CDPATH定义的目录中的test_shell目录,如下:

    [root@testserver ~]# CDPATH='/usr/local/shell_studying/' 
    [root@testserver ~]# cd test_shell 
    /usr/local/shell_studying/test_shell 
    [root@testserver test_shell]#

    变量EUID:记录当前用户的UID。root用户的UID为0

    [root@testserver ~]# echo $EUID 
    0

    变量FUNCNAME:在用户函数体内部,记录当前函数体的函数名。

    示例:创建funcname.sh文件并执行。

    [root@testserver shell_studing]# cat funcname.sh 
    #!/bin/bash
    funcname(){
            echo $FUNCNAME
    }
    funcname
    [root@testserver shell_studing]# chmod +x funcname.sh 
    [root@testserver shell_studing]# ./funcname.sh 
    funcname
    [root@testserver shell_studing]# 

    变量HISTCMD:记录下一个命令在history命令中的编号。

    示例:执行history命令后,最近1条命令的编号是1009,执行echo $HISTCMD命令的编号为1010,所以下一条命令的编号为1011。

    [root@testserver shell_studing]# history
    ....
    1008  2020-05-08 15:47:37 root ./funcname.sh 
    1009  2020-05-08 15:49:36 root history
    [root@testserver shell_studing]# echo $HISTCMD
    1011

    变量HISTFILE:记录history命令记录文件的位置。

    [root@testserver ~]# echo $HISTFILE
    /root/.bash_history

    变量HISTFILESIZE:设置HISTFILE文件记录命令的行数。限制历史命令记录的行数。

    [root@testserver ~]# echo $HISTFILESIZE
    1000

    变量HISTSIZE:命令缓冲区的大小。执行的命令,先记录在命令缓冲区,在缓冲区满或退出Shell时才将命令写入$HISTFILE

    [root@testserver ~]# echo $HISTSIZE
    1000

    变量HOSTNAME:展示主机名。

    [root@testserver shell_studing]# echo $HOSTNAME
    testserver

    变量HOSTTYPE:展示主机的架构。如i386、i686、x86_64等。

    [root@testserver shell_studing]# echo $HOSTTYPE
    x86_64

    变量MACHTYPE:主机类型的GNU标识。一般为“主机架构-公司-系统-gnu”

    [root@testserver shell_studing]# echo $MACHTYPE
    x86_64-redhat-linux-gnu

    变量LANG:设置当前系统的语言环境。

    [root@testserver shell_studing]# echo $LANG
    en_US.UTF-8
    [root@testserver shell_studing]# export LANG=zh_CN.UTF-8

    变量PWD:记录当前目录。

    [root@testserver shell_studing]# echo $PWD
    /usr/local/testuser/shell_studing

    变量OLDPWD:记录之前的目录。

    示例:前目录/usr/local/testuser/shell_studing,cd /root 切换路径后,/root为当前目录,则/usr/local/testuser/shell_studing为之前的目录,即$OLDPWD

    [root@testserver shell_studing]# echo $PWD
    /usr/local/testuser/shell_studing
    [root@testserver shell_studing]# cd /root
    [root@testserver ~]# echo $OLDPWD
    /usr/local/testuser/shell_studing
    [root@testserver ~]# 

    变量PATH:代表命令的搜索路径。

    [root@testserver ~]# echo $PATH
    /usr/local/module/maven-3.1.1/bin:/usr/local/jdk/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/maven/apache-maven-3.3.9/bin:/root/bin
    #设置PATH变量,新增路径/usr/local/testuser/至PATH
    [root@testserver
    ~]# export PATH=/usr/local/testuser/:$PATH [root@testserver ~]# echo $PATH /usr/local/testuser/:/usr/local/module/maven-3.1.1/bin:/usr/local/jdk/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/usr/local/maven/apache-maven-3.3.9/bin:/root/bin [root@testserver ~]#

    变量PS1:命令提示符。u是用户名,h是主机名,W是当前工作目录,$是UID的替换字符:如UID为0,则替换成#(root用户),否则替换成$。

    [root@testserver ~]# echo $PS1
    [u@h W]$

    其他变量:通过执行 man bash 查看man文件,在Shell Variable中查看(下图截取部分命令)。

    【学习参考文档】

    1. 书籍:《Linux系统命令及Shell脚本实践指南》 王军 著;
    2. Shell教程|菜鸟教程:https://www.runoob.com/linux/linux-shell.html

    【Ending】

    微信公众号“粒粒的测试笔记

  • 相关阅读:
    linux基础命令一
    Mac安装vue cli或者electron时 npm i 报错
    记MacOS抹盘后--使用U盘安装MacOS实录
    腾讯云申请SSL证书与Nginx配置Https
    Windows Server 2016 安装虚拟机版黑群晖
    FreeNas搭建踩坑指南(三)
    FreeNas搭建踩坑指南(二)
    FreeNas搭建踩坑指南(一)
    Apache2配置多域名站点及支持https
    ubuntu server 16.04 开启root密码登录
  • 原文地址:https://www.cnblogs.com/yllil/p/12850458.html
Copyright © 2011-2022 走看看