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种方式
- 
sh解析器执行方式: sh 脚本文件
- 
bash解析器执行方式: bash 脚本文件
- 
仅路径执行方式: ./脚本文件注意: 脚本文件自己执行需要具有可执行权限, 否则无法执行 
Shell变量
变量类型
- 系统环境变量
- 自定义变量
- 特殊符号变量
系统环境变量
是系统提供的共享变量.是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 | 
自定义变量
- 自定义局部变量
- 自定义常量
- 自定义全局变量
自定义局部变量
就是定义在一个脚本文件中的变量, 只能在这个脚本文件中使用的变量
定义与使用
var_name=value
变量定义规则:
- 变量名称可以有字母,数字和下划线组成, 但是不能以数字开头
- 等号两侧不能有空格
- 在bash环境中, 变量的默认类型都是字符串类型, 无法直接进行数值运算
- 变量的值如果有空格, 必须使用双引号括起来
- 不能使用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 | 

使用-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

识别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种格式区别
- 
使用单引号 ''的字符串:任何字符都会原样输出,在其中使用变量是无效的。 
- 
由双引号 " "包围的字符串:其中包含了变量,那么该变量会被解析得到值,而不是原样输出。 字符串中还可以出现双引号的子字符串,但是需要转义。 var1=haha echo "you are welcome \"${val1}\"" you are welcome "haha"
- 
不被引号包围的字符串 不被引号包围的字符串中出现变量时也会被解析,这一点和双引号 " "包围的字符串一样。字符串中不能出现空格,否则空格后边的字符串会作为其他变量或者命令解析。 
获取字符串的长度
${#字符串变量名}
字符串拼接方式
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
本文来自博客园,作者:bgtong,转载请注明原文链接:https://www.cnblogs.com/bgtong/p/16311151.html
 
                    
                     
                    
                 
                    
                 
         
                
            
         浙公网安备 33010602011771号
浙公网安备 33010602011771号