shell生活序

从编程语言的观点看linux shell-变量的作用域,环境变量,位置变量
我们仍以BASH 为讨论的shell 语言
每一种编程语言中,我们都会碰到变量的作用域的问题。(比如在函数中定义的变量在函数外不能使用的)
BASH 中也有类似的问题,局部变量和环境变量(全局变量)。
局部变量是普通的变量,仅在创建它的Shell中有效。
环境变量。我们更多的使用“环境变量”而不是“全局变量”,因为这个名称更
能体现它的特点。环境变量对创建它的Shell及其派生出来的子进程都有效。或者说环境变量可以继承,但它对其它与创建它的Shell没有关系的Shell并不可见。
声明环境变量:declare -x 变量名=值
                            export 变量名=值
                            export 已经定义的局部变量名
在谈谈另一类的重要变量,位置变量。函数,脚本等都需要参数,位置变量就是

用来获得这些参数的。相当于其它编程语言的形参。
$0  表示当前脚本文件名。
$1,$2,$3,........,$9,${10},.... 表示第1,2,3.......个参数。
$# 位置变量的个数
$* $@ 表示所有的位置变量。(当然,两者还是有区别的。)

shell中的变量和运算符

1.什么是变量?
   
    这个就不用废话了,shell中的变量跟其他高级语言中的变量概念是一样的。

2.shell中变量的类型?
    
    shell中的变量类型有:本地变量、环境变量、位置变量、标准变量、特殊变量。

    2.1.本地变量在shell脚本的生存周期中使用的变量(也就是登录一个shell到退出,这个shell为生存周期)设置一个本地变量格式为:变量名=变量,显示一个变量:echo ${变量名}也可以不要大括号,显示本地所有变量:set就可以,本地变量还可以设置为只读的:readonly 变量名,这时的变量就具有只读属性,如果在shell下运行命令readonly,就会显示当前环境下所有的只读变量。
   
    2.2.环境变量用于所有的用户进程(也就shell下所有的子进程),这个就有点像windows中的环境变量了(系统–>高级–>环境变量),环境变量一般保存在$HOME/.bash_profile和/etc/profile中,前者是只适用于当前用户,后者适用于所有用户设置一个环境变量用export,比喻我们这里设置一个环境变量:export pagename=”ghostwwl”这样就设置了一个叫做pagename的环境变量,我们可以通过env这个命令来查看,还有就是可以直接通过运行export来查看。

    2.3.位置变量也就相当于程序中的参数(也就相当于C中的argv),在shell中位置变量一般允许$0-$9一共10个,超过10个的,嘿嘿就必须使用其他方式了。很显然这里$0就是脚本的名字了,从$1开始就是后面的参数了。说白了也就是那个argv了。
我们这里举个小例子,比喻有shell程序aa.sh于下:
    #!/bin/bash
    #named aa
    echo “程序名为: $0″
    echo “姓名为: $1″
    echo “年龄为: $2″
    echo “所属省分为: $3″
    echo “所在城市为: $4″
    echo “第五个参数为: $5″

我们运行这个脚本 ./aa.sh ghostwwl 24 Hubei Wuhan 显示结果为:
    程序名为: ./aa.sh
    姓名为: ghostwwl
    年龄为: 24
    所属省分为: Hubei
    所在城市为: Wuhan
    第五个参数为:
可以看出因为第五个参数没有所以就为空了
当然我们可以在脚本中系统命令传递参数,比喻下面一句:
find /usr/share/realpaly -name $1 -print
这个脚本语句就可以在脚本中对文件目录/usr/share/realplay中文件名为第一个参数的文件进行查找。
说这么多他*的就是参数,搞半天。
  
    2.4.标准变量,也就是bash环境建立的一些标准环境的标量,他会自动去解析,基本都在/etc/profile中定义了有EXINIT,HOME,IFS,LOGNAME,MAIL,MAILCHECK等。
    EXINIT 是vi编辑器初始化运行的一些参数
    HOME 这个傻子都知道,就是偶们的主目录
    IFS 一个个字段域之间用什么隔开的理论上可以任意字符,比喻/usr/bin;/usr/sbin
这里的IFS就是”;”了。
    LOGNAME 看名字就知道 是登录名可以用 echo $LOGNAME 来查看
    MAIL 表示当用户的邮箱路径
    MAILCHECK 表示每间隔多少秒检查一次收件箱
还有一堆标准变量PATH,tz,PS1,PS2,PWD等等,我这里就不全部写了,自己去找资料看,相信应该蛮好找的。

    2.5.特殊变量
$# 表示传递到脚本的参数列表
$* 以一个字符串显示所有向脚本传递的参数,跟位置变量不同的是这里参数可超过9个。
$$ 表示当前运行脚本的进程ID号
$! 表示后台运行的一个进程的ID号
$@ 与$#相同,但是使用时加引号,并在引号中返回每一个参数
$- 显示shell使用的当前选项,与set命令相同
$? 显示最后命令运行的推出状态,0表示没有错误,其他任何值表示有错误 

3.shell中的变量替换

    这里说一下变量替换这个经常用到,其实就是用变量的值替 换他的名字,显示变量的时候就是这个,可以用:
为了试验我们先定义一个变量haha=”**** you”
     a.${变量名}来搞定(这里的大括号可要可不要,不过偶一般都加)
     b.${变量名:+变量值}这个表示如果前面的变量值不为空,则显示变量值,否则置空,比喻echo ${name:+”ghostwwl”}这样可不管你以前有没有对name赋过值都会显示这里的”ghostwwl”
     c.${变量名:?错误信息}这个表示当变量名存在,就是变量的值,不存在就显示问号后面的错误信息比喻echo ${age:+”No defined variable age”}这个因为age不存在所以它会显示错误信息age:No defined variable age
     d.${变量名:-变量值}这个表示如果如果变量名没有设置,就用这里给出变量值来代替,显然如果设置了肯定就是返回原来设置的值:比喻echo ${age:-24}因为age变量没有设置,所以它会用24去代替,如果是echo ${haha:-”hello”}这里会显示原来所赋的值”**** you”记得不要跟b中的情况搞混。
     e.${变量名:=变量值}表示如果没有设置变量名这个变量,就设置它的值,比喻echo ${age:=24}因为没有设置age这个值,所以运行这句的时候会赋值并显示。当然这样赋值以后就可以把age当正常变量用了,也就是这时我们有haha和age这两个变量了。

    就这五种了(当然如果把第一种去掉大括号,就6种了),开始可能并不习惯,用多了就习惯了,啊哈哈!

4.清除变量(unset)
    能定义变量当然也就能删除变量了,比喻我们要删除那个haha,因为值为”**** you”不太文明,我们可以用:unset haha 从这里就可以看出清除变量用unset 变量名。
    这里我们要注意,设置了readonly的只读变量不能取消也不能重新设置值。

我们这里再来把前面个例子改一下:
    #!/bin/bash
    #named aa
    echo “程序名为: $0″
    echo “姓名为: $1″
    echo “年龄为: $2″
    echo “所属省分为: $3″
    echo “所在城市为: $4″
    echo “参数个数为: $#”
    echo “脚本参数为: $*”
    echo “脚本进程ID为: $$”
我们再来运行这个脚本 ./aa.sh ghostwwl 24 hubei wuhan 结果为:
    程序名为: ./aa.sh
    姓名为: ghostwwl
    年龄为: 24
    所属省分为: hubei
    所在城市为: wuhan
    脚本参数个数为: 4
    脚本参数为: ghostwwl 24 hubei wuhan
    脚本进程ID为: 212

5.影响变量的一些命令
    5.1 declare 创建或显示变量
        参数-f 只显示函数名
        参数-r 创建只读变量(typeset也可以)
        参数-x 创建转出变量
        参数-i 创建整数变量
        如果参数中使用+来代替-,表示选项的含义相反。
    
    5.2 export 创建环境变量
        参数– 表明选项结束,所有后面的参数都是实参
        参数-f 表示在”变量-值”对照中的变量是一个函数名
        参数-n 表示把全局变量转换成局部变量(也就是本地变量)。
        参数-p 显示全局变量列表
 
    5.3 readonly 创建或显示只读变量
        参数– 表示选项结束
        参数-f 创建只读变量

    5.4 set 设置或者重设各种shell
    5.5 shift [n] 用来移动或调整位置变量,使$4赋给$3(也就是全都向前面移动一次),这个里面的n表示移动几位,默认是移动一位。
    5.6 typeset 这个就跟declare相同了
    5.7 unset 清除变量的定义
        参数– 表示选项结束
        参数-f 删除只读变量,但是不能sehll环境中制定的变量和函数。

6.shell的运算符
   6.1 位运算 ~,>>,<<,&,|,^ 一看就知道分别是取反,左移,右移,与,或,异或。
   6.2 $[]表示对[]中的表达式求值和$(())相等的。
   6.3 逻辑运算符 &&,||,>,<,==,!= 是人都看得懂跟C里一样的。 

   6.4 赋值运算符 =,+=,-=,*=,/=,%=,&=,|=,<<=,>>=,^= 跟其他语言差不多一看就明白的。当然表达式赋值let $a=$b+$c这种形式。

   6.5 运算符的优先级我就不想废话了,都跟其他语言差不多的,自己去找。


http://why-gudu.spaces.live.com/Blog/cns!1pziotErZQfm5-4NtdB7DJ3w!155.entry

http://bbs.topsage.com/dv_rss_xm_119_195915_1.html

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/535593.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

linux下安装phantomjs

PhantomJS俗称为&#xff1a;无界面的浏览器。 PhantomJS是一个基于webkit的JavaScript API。它使用QtWebKit作为它核心浏览器的功能&#xff0c;使用webkit来编译解释执行JavaScript代码。任何你可以在基于webkit浏览器做的事情。 1、下载安装包 官网下载地址&#xff1a;htt…

shell 生活0806012145

引用&#xff1a;        学习 Shell Scripts 如果您真的很想要走信息这条路&#xff0c;并且想要好好的管理好属于您的主机&#xff0c;那么&#xff0c;别说鸟哥不告诉您&#xff0c; Shell Scripts 真的是必须要学习的一项课题呢&#xff01;基本上&#xff0c; shel…

linux系统启动流程详解

一、MBR的概念 主引导扇区位于硬盘的0磁道0柱面1扇区,共512bytes,可存放一小段程序及主分区表,由三大部分组成: 硬盘主引导记录MBR(Master Boot Record)占446bytes 分区表DPT(Disk Partition Table)占64bytes 硬盘有效标志(Magic Number)占2bytes。 硬盘…

linux下安装davinci

官网地址 https://edp963.github.io/davinci/ 1、准备 JDK 1.8&#xff08;或更高版本&#xff09; MySql5.5&#xff08;或更高版本&#xff09; Mail Server (本人测试可以不用安装) phantomjs 或 chrome&#xff08;需同时安装chromedriver&#xff0c;清注意版本&#xf…

GRUB详解

一、GRUB介绍 GRUB (GRand Unified Bootloader)是GNU 下的FSF 组织所推行的一套多重开机管理软件,目前 GRUB 在 Linux 上使用的版本为 0.97 版,FSF 的官方网站表示已经不会在此版本上再追加任何新的功能,会将心思放在 GRUB 2 上。 GNU GRUB(GRand Unified Bootloader)是一…

好用的yum

从Windows转到Linux下面&#xff0c;一个不习惯的地方就是在图形界面下安装和删除软件的时候非常缓慢。但是如果你掌握了用yum的命令行模式进行配置程序&#xff0c;你肯定会从心底喜欢上这个强大的工具。因为yum提供了查找、安装、删除某一个、一组甚至全部软件包的命令&#…

Ambari系统架构

一、Ambari系统架构 Ambari框架采用的是Server/Client的模式&#xff0c;主要由两部分组成&#xff1a;ambari-agent和ambari-server。ambari依赖其它已经成熟的工具&#xff0c;例如其ambari-server 就依赖python&#xff0c;而ambari-agent还同时依赖ruby, puppet&#xff0…

Linux系统的基本安装

一、制作Linux安装启动盘 1.准备一个干净的U盘&#xff0c;格式化。 2.下载64位系统镜像&#xff1a;rhel-server-6.8-x86_64-dvd.iso。64位系统直接安装就好&#xff0c; 3.首先制作一个启动盘&#xff0c;解压rhel-server-6.8-i386-dvd.iso文件 4.下载安装UltraISO&#…

linux tips 技巧笔记一

作者: Jeffrey出处: http://blog.zhangjianfeng.com/?p171 实现RedHat非正常关机的自动磁盘修复先登录到服务器&#xff0c;然后在/etc/sysconfig里增加一个文件autofsck,内容如下&#xff1a;AUTOFSCK_DEF_CHECKyesPROMPTyes 改变文件或目录之最后修改时间(变为当前时间)执…

Shell基本概念

一、什么是shell shell是外壳的意思&#xff0c;就是操作系统的外壳。我们可以通过shell命令来操作和控制操作系统&#xff0c;比如Linux中的Shell命令就包括ls、cd、pwd等等。总结来说&#xff0c;Shell是一个命令解释器&#xff0c;它通过接受用户输入的Shell命令来启动、暂…

Shell解释器

shell解释器&#xff0c;用户和操作系统内核之间的桥梁 一、Shell常见种类 就像不同地区有不同方言一样&#xff0c;不同的Linux/Unix系统使用着不同类型的shell Bsh:由贝尔实验室编写。Bsh是产生较早的UNIX Shell程序&#xff0c;实现了最基本的命令解释器的功能&#xff0c…

mysql安装、导入数据脚本

mysql安装&#xff1a; #!/bin/bash if [ $(id -u) ! "0" ]; thenecho "Error: You must be root to run this script, please use root to install mysql"exit 1 fi unzip Mysql.zip cd /home/install_LFS/Mysql cur_dir$(pwd) mkdir -p /usr/local/mysq…

linux tips 技巧笔记二

如何查找大小为500K到1000K之间的文件find / -type f -size 500k -and -size -1000k 仅列出当前目录下的文件名.find ./ -type f -maxdepth 1 -exec basename {} /; 让主机不响应pingecho 1 > /proc/sys/net/ipv4/icmp_echo_ignore_all若想恢复就用echo 0 > /proc/sys/…

Shell脚本——入门

shell脚本编程需要注意以下几个事项&#xff1a; shell脚本名称命名一般为英文的大写、小写&#xff1b;不能使用特殊符号、空格来命名&#xff1b;shell脚本后缀以.sh结尾&#xff1b;不建议shell命名为纯数字&#xff0c;一般以脚本功能命名&#xff1b;shell脚本内容首行需以…

Linux下C开发环境的构成和安装

本文介绍了Linux的C开发环境的构成和安装&#xff0c;使读者对Linux的C开发环境能有初步的了解。 你了解Linux吗&#xff1f;相信现在越来越多的人会说“是”的。那么你了解到何种程度呢&#xff1f;不可否认&#xff0c;目前决大多 数的Linux用户对Linux的了解还处于比较低级的…

Shell脚本——变量

变量是任何一种编程语言都必不可少的组成部分&#xff0c;变量用来存放各种数据。脚本语言在定义变量时通常不需要指明类型&#xff0c;直接赋值就可以&#xff0c;Shell 变量也遵循这个规则 在 Bash shell 中&#xff0c;每一个变量的值都是字符串&#xff0c;无论你给变量赋值…

基础环境安装脚本

#/bin/bash # Check if user is root if [ $(id -u) ! "0" ]; thenecho "Error: You must be root to run this script, please use root"exit 1 fiecho "安装环境包"if [ -f /etc/yum.repos.d/rhel-source.repo ];thenrm -r /etc/yum.repos.d…

Apache 虚拟主机的配置[Ubuntu]

基本配置 我们都知道&#xff0c;如果我们想在单台机器上设置多个域名或主机名时&#xff0c;我们就要用到基于名称的虚拟主机了。那么要如何进行设置呢&#xff1f;这就是本 HowTo 想解决的问题了。在 Ubuntu 的 /etc/apache2/ 目录下有个 Apache2 的主配置文件 apache2.conf…

Shell脚本——数字计算

Shell 和其它编程语言不同&#xff0c;Shell 不能直接进行算数运算&#xff0c;必须使用数学计算命令 要想让数学计算发挥作用&#xff0c;必须使用数学计算命令&#xff0c;Shell 中常用的数学计算命令如下表所示。 运算操作符/运算命令说明(( ))用于整数运算&#xff0c;效率…

windows下最好的C++ IDE

1. 你是不是用惯了VC6.0&#xff1f;假如是&#xff0c;我现在推荐的IDE仍然是VC6.0的IDE。 2. 你是不是觉得VC6.0过时了&#xff0c;很多C语法它都不支持&#xff1f;我现在推荐的编译器她在一直发展着&#xff0c;支持最新的C语法。 3. VC.net的界面弱智&#xff0c;而且包含…