网上得来终觉浅

_φ(❐_❐✧ 人丑就要多读书

导航

shell学习[一]:语法及变量

Shell概述

查看linux系统支持的shell解析器

cat /etc/shells

shell解析器类型

解析器类型 介绍
/bin/sh Bourne Shell,是UNIX最初使用的shell;
/bin/bash Bourne Again Shell它是Bourne Shell的扩展,简称bash,是LinuxOS默认shell,有灵活和强大的编辑接口,同时又很友好的用户界面,交互性很强;
/sbin/nologin 未登录解析器, shell设置为/sbin/nologin 是用于控制用户禁止登陆系统的, 有时候有些服务,比如邮件服务,大部分都是用来接收主机的邮件而已,并不需要登陆
/bin/dash dash(Debian Almquist Shell),也是一种 Unix shell。它比 Bash 小,只需要较少的磁盘空间,但是它的对话性功能也较少,交互性较差。
/bin/csh C Shell是C语言风格Shell
/bin/tcsh 是C Shell的一个扩展版本。

查询默认的解析器:

echo $SHELL

Shell脚本文件编写规范

脚本文件后缀名规范:后缀名建议使用 .sh 结尾

首行需要设置Shell解析器的类型, 语法

#!/bin/bash

注释格式

单行注释, 语法

# 注释内容

多行注释, 语法

:<<!
# 注释内容1
# 注释内容2
!

脚本文件的常用执行3种方式

  1. sh解析器执行方式:sh 脚本文件

  2. bash解析器执行方式:bash 脚本文件

  3. 仅路径执行方式:./脚本文件

    注意: 脚本文件自己执行需要具有可执行权限, 否则无法执行

Shell变量

变量类型

  1. 系统环境变量
  2. 自定义变量
  3. 特殊符号变量

系统环境变量

是系统提供的共享变量.是linux系统加载Shell的配置文件中定义的变量共享给所有的Shell程序使用

Shell的配置文件分类

1.全局配置文件
/etc/profile
/etc/profile.d/*.sh
/etc/bashrc

2.个人配置文件
当前用户/.bash_profile
当前用户/.bashrc

一般情况下,我们都是直接针对全局配置进行操作。

环境变量分类

系统级环境变量:Shell环境加载全局配置文件中的变量共享给所有用户所有Shell程序使用, 全局共享
用户级环境变量:Shell环境加载个人配置文件中的变量共享给当前用户的Shell程序使用, 登录用户使用

查看当前Shell系统环境变量

env

查看Shell变量(系统环境变量+自定义变量+函数)

set

常用系统环境变量

变量名称 含义
PATH 与windows环境变量PATH功能一样,设置命令的搜索路径,以冒号为分割
HOME 当前用户主目录:/root
SHELL 当前shell解析器类型:/bin/bash
HISTFILE 显示当前用户执行命令的历史列表文件:/root/.bash_history
PWD 显示当前所在路径:/root
OLDPWD 显示之前的路径
HOSTNAME 显示当前主机名:itheima
HOSTTYPE 显示主机的架构,是i386、i686、还是x86、x64等:x86_64
LANG 设置当前系统语言环境:zh_CN.UTF-8

自定义变量

  1. 自定义局部变量
  2. 自定义常量
  3. 自定义全局变量

自定义局部变量

就是定义在一个脚本文件中的变量, 只能在这个脚本文件中使用的变量

定义与使用

var_name=value

变量定义规则:

  1. 变量名称可以有字母,数字和下划线组成, 但是不能以数字开头
  2. 等号两侧不能有空格
  3. 在bash环境中, 变量的默认类型都是字符串类型, 无法直接进行数值运算
  4. 变量的值如果有空格, 必须使用双引号括起来
  5. 不能使用Shell的关键字作为变量名称

查询变量值:

# 语法1: 直接使用变量名查询
$var_name
# 语法2: 使用花括号
${var_name}
# 区别: 花括号方式适合拼接字符串

变量删除

unset var_name

自定义常量

就是变量设置值以后不可以修改的变量叫常量, 也叫只读变量

readonly var_name

自定义全局变量

全局变量在当前Shell环境与子Shell环境中都可以使用

export var_name1 var_name2

特殊变量

特殊变量 含义
$n #用于接收脚本文件执行时传入的参数
$0 用于获取当前脚本文件名称
$1~$9, 代表获取第一输入参数到第9个输入参数
第10个以上的输入参数获取参数的格式: ${数字}, 否则无法获取
$# 获取所有输入参数的个数
$*$@ 相同:都是获取所有输入参数
区别:
1.不使用双引号括起来, 功能一样
$和$@获取所有输入参数,格式为: $1 $2 ... $n
2.使用双引号括起来
"$
"获取的所有参数拼接为一个字符串, 格式为: "$1 $2 ... $n"
"$@"获取一组参数列表对象, 格式为: "$1" "$2" ... "$n"
使用循环打印所有输入参数可以看出区别
$? 用于获取上一个Shell命令的退出状态码(执行结果), 或者是函数的返回值
每个Shell命令的执行都有一个返回值, 这个返回值用于说明命令执行是否成功
一般来说, 返回0代表命令执行成功, 非0代表执行失败
$$ 用于获取当前Shell环境的进程ID号
同ps -aux|grep bash

循环语法

for var in 列表变量
do		# 循环开始
   命令  # 循环体
done    # 循环结束


#! /bin/bash
for item in $*
do
echo $item
done

Shell环境变量深入

自定义系统环境变量:/etc/profile

当前用户进入Shell环境初始化的时候会加载全局配置文件/etc/profile里面的环境变量, 供给所有Shell程序使用

加载流程介绍与测试

Shell工作环境介绍

用户登录系统时,Shell为用户定义了工作环境,工作环境提供了共享数据环境变量,比如shell解析器类型、主机名等,这些数据存储在环境变量中,便于shell脚本程序操作使用;

shell工作环境分类

交互式与非交互式shell

交互式Shell:黑窗口

非交互式Shell:脚本

登录Shell与非登录Shell环境

类型名称 含义
shell登录环境 需要用户名、密码登录之后才能进入的shell
shell非登录环境 直接不用输入用户名和密码就可以打开的shell或调用子Shell时使用的工作环境

注意:不同的工作环境加载环境变量流程不一样

环境变量初始化流程

分类 初始化环境变量过程执行文件顺序
shell登录环境变量初始化过程 /etc/profile--》/etc/profile.d/*.sh--》/.bash_profile--》/.bashrc--》/etc/bashrc
shell非登录环境变量初始化过程 ~/.bashrc--》/etc/bashrc--》/etc/profile.d/*.sh

image

使用-l 或 --login 先加载Shell登录环境变量,再执行脚本文件

# 先加载shell登录环境变量, 然后再执行脚本文件
bash -l 脚本文件 或  bash --login 脚本文件 
sh -l 脚本文件  或 sh --login 脚本文件
bash  # 加载shell非登录环境变量
bash 脚本文件  / sh 脚本文件  #执行脚本

识别Shell环境类型

识别shell环境的命令1

echo $0

输出 -bash 代表:shell登录环境

输出 bash 代表: shell非登录环境

注意:这个 $0 环境变量如果用在子shell中(shell脚本文件)输出Shell脚本本身的文件名

bash命令:用于切换为Shell非登录环境

bash

image

识别shell环境的命令2

logout命令:退出Shell登录环境

logout

exit命令:退出Shell登录或非登录环境

exit

详细切换Shell环境

切换环境方式1:直接登录系统:默认进入shell登陆环境

切换环境方式2:su切换用户登录

su 用户名 --login 
或
su 用户名 -l
 # 切换到指定用户, 加载Shell登录环境变量
su 用户名  
# 切换到指定用户,  加Shell非登录环境变量

切换环境方式3:bash切换

语法1:

bash  # 加载【Shell非登录环境】

语法2:

bash -l  Shell脚本文件 /  bash --login shell脚本文件
sh -l shell脚本文件 / sh --login shell脚本文件
# 先加载【Shell登录环境】然后运行指定Shell脚本文件

Shell字符串变量

字符串的3种格式区别

  1. 使用单引号 '' 的字符串:

    任何字符都会原样输出,在其中使用变量是无效的。

  2. 双引号" "包围的字符串:

    其中包含了变量,那么该变量会被解析得到值,而不是原样输出。

    字符串中还可以出现双引号的子字符串,但是需要转义。

    var1=haha
    echo "you are welcome \"${val1}\"" 
    you are welcome "haha"
    
  3. 不被引号包围的字符串

    不被引号包围的字符串中出现变量时也会被解析,这一点和双引号" "包围的字符串一样。

    字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。

获取字符串的长度

${#字符串变量名}

字符串拼接方式

boguotong@boguotong ~ % var1=hello         
boguotong@boguotong ~ % var2=bgt           
boguotong@boguotong ~ % echo ${var1}${var2} #无符号拼接
hellobgt
boguotong@boguotong ~ % echo "${var1}${var2}" #双引号拼接
hellobgt
boguotong@boguotong ~ % echo ${var1}"&"${var2}   #混合拼接
hello&bgt
boguotong@boguotong ~ % echo ${var1}'&'${var2}    #混合拼接
hello&bgt

字符串截取语法

格式 说明
${变量名:start:length} 从 string 字符串的左边第 start 个字符开始,
向右截取 length 个字符。
${变量名:start} 从 string 字符串的左边第 start 个字符开始截取,直到最后。
${变量名:0-start:length} 从 string 字符串的右边第 start 个字符开始,
向右截取 length 个字符。
${变量名:0-start} 从 string 字符串的右边第 start 个字符开始截取,直到最后。
${变量名#*chars} 从 string 字符串第一次出现 *chars 的位置开始,
截取 *chars 右边的所有字符。
${变量名##*chars} 从 string 字符串最后一次出现 *chars 的位置开始,
截取 *chars 右边的所有字符。
${变量名%chars*} 从 string 字符串最后第一次出现 chars* 的位置开始,
截取 chars* 左边的所有字符。
${变量名%%chars*} 从 string 字符串第一次出现 chars* 的位置开始,
截取 chars* 左边的所有字符

数组变量

注意Bash Shell 只支持一维数组,不支持多维数组。

数组的定义

在 Shell 中,用括号( )来表示数组,数组元素之间用空格来分隔. 语法为:

array_name=(item1  item2 ...)  # 方式1
array_name=([索引下标1]=item1  [索引下标2]=item2  ...)  # 方式2

1.定义数字数组

nums=(29 100 13 8 91 44)

2.Shell 是弱类型的,它并不要求所有数组元素的类型必须相同

arr=(20 56 "http://www.itcast.cn/")

Shell数组元素定义后不是固定的, 定义后还可以赋值

arr[6]=100

3.可以给指定元素赋值初始化

arr2=([0]=1 [2]=100 [4]=aa)
#由于上面只赋值了3个元素, 所以数组的长度是3

数组的获取

获取指定索引的值 ${arr[index]}

获取值同时复制给其他变量 item=${arr[index]}

使用 @* 可以获取数组中的所有元素 ${arr[@]} 或 ${arr[*]}

获取数组的长度或个数 ${#arr[@]} 或 ${#arr[*]}

获取数组指定元素的字符长度 ${#arr[索引]}

数组的拼接

array_new=(${array1[@]} ${array2[@]} ...)
array_new=(${array1[*]} ${array2[*]} ...)

数组的删除

删除数组指定元素数据 unset array_name[index]

删除整个数组 unset array_name

posted on 2022-05-25 22:03  bgtong  阅读(92)  评论(0编辑  收藏  举报