linux bash变量作用域
linux bash变量作用域
一,思考一个问题,当在shell里执行某个程序时,shell是怎么找到这个程序的?
shell会去$PATH环境变量定义的目录里去找这个命令。环境变量里一般包括/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/root/bin这么多目录,这些目录下又有上千个程序,从这么多目录里的,这么多程序里查找肯定是花费时间的。shell为了提高查找效率,使用了缓存机制,这个机制叫hash。。
有了hash缓存后,shell先去hash里查找,如果找到了,就使用;如果没有找到,才去$PATH环境变量定义的目录里去找,找到后,把命令的路劲加程序名放入hash中。
注意:如果是shell的buildin命令,不会放入hash。
hash命令用法:
查看hash里都缓存了哪些程序:
hashhits:代表此命令,被命中了几次。
# hash
hits command
1 /usr/bin/cat
2 /usr/bin/ls
详细查看hash里都缓存了哪些程序:
hash -l# hash -l
builtin hash -p /usr/bin/cat cat
builtin hash -p /usr/bin/ls ls
清除某个缓存:
hash -d cat# hash -d cat
# hash
hits command
2 /usr/bin/ls
清除所有缓存:
hash -r# hash -r
# hash
hash: hash table empty
为什么还要清除缓存?理由:当把命令移动到别的目录后,用原来的缓存就找不到命令了,shell会报出错误,所有要清除。
二,bash变量的作用域
shell进程的子孙进程。
在shell进程里又启动了别的shell进程,下面的例子是在bash里又启动了一个bash,让后在新启动的bash里,又启动了一个csh。
# pstree
systemd─┬
├─sshd───sshd───bash───pstree
# bash
# csh
# pstree
systemd─┬
├sshd───sshd───bash───bash───csh───pstree
bash变量种类:
按变量的作用域范围分为:
本地变量:作用域仅为当前shell进程
验证本地变量的作用域:
# firstName=jerry
# echo $firstName
jerry
# csh
# echo $firstName
firstName: Undefined variable.
# exit
exit
# echo $firstName
jerry
赋值:name=value
引用:${name},$name
- "":变量会被替换成其值
- '':变量不会被替换成其值
查看变量:set
撤销变量:unset name。注意name前不要加$
# firstname=tom
# echo $firstname
tom
# unset firstname
# echo $firstname
环境变量:作用域为当前shell进程,及其子孙shell进程。
验证环境变量的作用域:
# fn=tom
# echo $fn
tom
# export fn
# csh
# echo $fn
tom
# exit
exit
# echo $fn
tom
赋值:
export name=value
name=value
export name
declare -x name=value
name=value
declare -x name
引用:同本地变量。
撤销变量:unset name。注意name前不要加$
bash内嵌的环境变量:
PATH,HISTORY,HISTSIZE,HISTFILESIZE,HISTCONTROL,SHELL,HOME,UID,PWD,OLDPWD查看环境变量命令:
export,declare -x,printenv,env
只读变量(常量):作用域是当前shell进程,且不可以撤销。随当前shell进程的终止而终止。
- declare -r name
- readonly name
检证常量的作用域:
# la=foo
# declare -r la
# echo $la
foo
# csh
# $echo la
echo: Undefined variable.
# exit
exit
# echo $la
foo
# la=aa
-bash: la: readonly variable
[root@localhost ~]# unset la
-bash: unset: la: cannot unset: readonly variable
- 局部变量:函数里的变量,作用域仅为函数内。
位置参数变量:shell脚本的参数
特殊变量:
- $?:上一个命令的执行结果。0:成功;1-255:失败。
- ...
bash里,多个命令一起执行
多个命令连续执行:
command1;command2;command3...这些命令都会被执行。
多个命令逻辑连续执行
根据前面命令的执行结果(成功或者失败),决定是否执行后面的命令。
前一个命令执行成功后,后面的命令才让执行:
&&例子:先查看目录存不存在,存在了才进入此目录
# pwd
/root
# ls /sdf && cd /tmp
ls: cannot access /sdf: No such file or directory
# pwd
/root
# ls /sdf || cd /tmp
ls: cannot access /sdf: No such file or directory
# pwd
/tmp
前一个命令执行失败后,后面的命令才让执行:
||例子:先某个用户存不存在,不存在则创建此用户;存在了就不创建了。
# pwd
/root
# ls /sdf || cd /tmp
ls: cannot access /sdf: No such file or directory
# pwd
/tmp
三,如何执行shell脚本文件
1,用chmod赋予shell文件可执行权限。
./shell.sh
2,把shell文件(这个文件不需要有执行权限)作为参数,传给bash程序。
bash shell.sh
练习1
1,显示/etc目录下所有以p(不区分大小写)开头的文件或者目录本身。
2,显示/var目录下的所有文件或目录,并将显示结果中的小写字母转换为大写后显示
3,创建临时文件/tmp/myfile.XXXX
#!/bin/bash
ls -ld /etc/p*
ls -d /var/* | tr 'a-z' 'A-Z'
mktemp /tmp/myfile.XXXX
四,bash配置文件
1,启动shell进程的种类:
- 交互方式启动的shell进程
- 直接通过终端输入账号密码后登录后,启动的shell进程
- 使用su命令:
su - username,或者使用su-l username,登录后,启动的shell进程
- 非交互方式启动的shell进程
- 使用su命令:
su username,登录后,启动的shell进程 - 在gnome或者kde下打开终端后,启动的shell进程
- 执行shell脚本文件时,启动的shell进程
- 使用su命令:
2,bash配置文件的种类
profile类
对所有用户都有效,只有管理员才可以修改下面的配置文件
- /etc/profile
- /etc/profile.d/*.sh
仅对当前用户有效
~/.bash_profile
功用:
- 用于定义环境变量
- 运行命令或脚本
bashrc类
对所有用户都有效,只有管理员才可以修改下面的配置文件
/etc/bashrc
仅对当前用户有效
~/.bashrc
功用:
- 定义本地变量
- 定义命令别名
3,bash配置文件的加载顺序。
交互方式启动的shell进程
/etc/profile--->/etc/profile.d/*.sh--->/.bash_profile--->/.bashrc--->/etc/bashrc
非交互方式启动的shell进程
~/.bashrc--->/etc/bashrc--->/etc/profile.d/*.sh
4,重新加载配置文件
- 当修改配置文件后,是不会立即生效的
- 使用
source 配置名,让修改的配置立即生效
五,用emacs编写shell脚本
1,自动补全的快捷键:ESC TAB
# c/c++ 学习互助QQ群:877684253

# 本人微信:xiaoshitou5854
linux bash变量作用域的更多相关文章
- linux bash变量替换(# ## % %% / //)
VAR=hahaha echo ${VAR#*h} # ahaha 从前向后匹配删除 VAR=hahaha echo ${VAR##*h} # a 贪婪模式,从前向后匹配删除所有 VAR=hahaha ...
- 在Linux系详解Linux bash中的变量
(大讲台:国内首个it在线教育混合式自适应学习) 统中进行日常运维或者是编写脚本时,变量是再熟悉不过的了,但这些变量都有哪些类型,具体的用法又有哪些差异呢?本文整理分享给大家: 一.bash变量类型: ...
- linux shell自定义函数(定义、返回值、变量作用域)介绍
http://www.jb51.net/article/33899.htm linux shell自定义函数(定义.返回值.变量作用域)介绍 linux shell 可以用户定义函数,然后在shell ...
- 【Linux】linux bash shell之变量替换::=句法、=句法、:-句法、-句法、=?句法、?句法、:+句法、+句法
linux bash shell之变量替换::=句法.=句法.:-句法.-句法.=?句法.?句法.:+句法.+句法 linux bash shell之变量替换::=句法.=句法.:-句法.-句法. ...
- linux学习18 shell脚本基础-bash变量和逻辑运行
一.回顾 1.用户管理,权限管理,install,mktemp 2.用户管理: 3.权限管理: mode,ownership mode: user group other r w x 4.命令:ins ...
- [转帖]linux bash环境变量简单总结
linux bash环境变量简单总结 来源链接:http://www.178linux.com/8005 原创文章,如有转载,请注明原文地址 需要简单学习一下. 其实 我都是直接放一个 .sh文件到 ...
- Linux环境变量和本地变量
每一种编程语言中,我们都会碰到变量的作用域的问题.(比如在函数中定义的变量在函数外不能使用的) BASH 中也有类似的问题,局部变量和环境变量(全局变量). 局部变量是普通的变量,仅在创建它的Shel ...
- Linux学习笔记之Linux环境变量总结
0x00 概述 Linux是一个多用户多任务的操作系统,可以在Linux中为不同的用户设置不同的运行环境,具体做法是设置不同用户的环境变量. 0x01 Linux环境变量分类 按照生命周期来分,Lin ...
- Linux环境变量总结 转
转自https://www.jianshu.com/p/ac2bc0ad3d74 Linux是一个多用户多任务的操作系统,可以在Linux中为不同的用户设置不同的运行环境,具体做法是设置不同用户的环境 ...
随机推荐
- 如何在SQL Server 2008下轻松调试T-SQL语句和存储过程
一.回顾早期的SQL SERVER版本:早在SQL Server 2000时代,查询分析器的功能还很简陋,远不如VS那么强大.到SQL Server 2005时代,代码高亮.SQL优化等功能逐渐加强, ...
- 《软件安装》centos 安装 mysql
上期问题回顾 全球 IPv4 地址正式耗尽,IPv4地址大约42.9亿,按照理论来说,每一个联网的设备都需要IP地址,而现在全球联网设备远远不止42.9亿,那么,这么多设备是怎么处理联网的问题呢? 先 ...
- day20190915write from memory
jQuery_Chapter02_20190912/ jQuery操作类样式.html <!DOCTYPE html> <html> <head> <meta ...
- scrapy框架安装配置
scrapy框架 scrapy安装(win) 1.pip insatll wheel 2.下载合适的版本的twisted:http://www.lfd.uci.edu/~gohlke/pythonli ...
- JavaEE基础(01):Servlet实现方式,生命周期执行过程
本文源码:GitHub·点这里 || GitEE·点这里 一.Servlet简介 Java编写的服务器端程序,具有独立于平台和协议的特性,主要功能在于交互式地浏览和生成数据,生成动态Web内容.使用S ...
- 基于Docker快速搭建ELK【华为云技术分享】
[摘要] 本文基于自建的Docker平台速搭建一套完整的ELK系统,相关的镜像直接从Docker Hub上获取,可以快速实现日志的采集和分析检索. 准备镜像 l 获取ES镜像:docker pull ...
- RDS关系型数据库 入门 01 创建关系型数据库实例【华为云分享】
[摘要] 关系型数据库(Relational Database Service,简称RDS)是一种基于云计算平台的即开即用.稳定可靠.弹性伸缩.便捷管理的在线关系型数据库服务.RDS具有完善的性能监控 ...
- 主题: 002.04 Tkinter 星空大战
为了更加熟练 Tkinter 的应用,决定只用 Tkinter 来写一个游戏,而不是用 Pygame, 在过程中,出了很多很大的问题,最后留了一点已知的问题,不想在花时间去找出来,不过整个程序算跑的没 ...
- Python发送邮件以及对其封装
对Python发送邮件进行封装 Python发送邮件分为四步 连接到smtp服务器 登陆smtp服务器 准备邮件 发送邮件 导入所需要的包 import smtplib from email.mime ...
- CentOS 8安装
1.VMware workstation14Pro安装 下载蓝点网,序列号也有,直接输入,永久激活 2.CentOS8下载 CentOS8下载地址:清华源 3.CentOS8安装