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