一.基本的运行Linux程序的3种方法:

(1) 使文件具有可执行权限,直接运行文件。eg:  chmod a+x testfile.sh   ./testfile.sh

(2) 直接调用命令解释器来执行程序。eg: python testfile.sh   (根据文件开头声明的命令解释器进行调用)

(3) 使用source执行文件  eg:  source testfile.sh   .testfile.sh  (t通常用于重新执行刚修改的初始化文件,使之立即生效)

Shell的命令有3种:内建命令,Shell函数和外部命令。

(a).内建命令:Shell程序本身包含的命令,这些命令集成在解释器中。部分内建命令的存在是为了修改Shell的属性设置(环境变量),在执行内建命令的时候,没有进程的消失和创建;另一部分内建命令则是I/O命令,eg. echo命令。

(b).Shell函数就是一系列代码,以Shell函数写成,可以被其他命令引用。

(c).外部命令是独立于shell的可执行程序。例如 find,grep。命令shell在执行外部命令时,会创建一个当前Shell的复制进程来执行。执行过程中,存在进程的创建和消失。(子进程创建初期和父进程一样环境,但是子进程不能改变父进程的参数变量)

外部命令执行过程:

1.调用POSIX系统fork函数接口,创建一个命令行Shell进程的复制(子进程);

2.在子进程的运行环境中,查找外部命令在Linux文件系统中的位置,如果外部命令给出了完全路径,则跳过查找这一步;

3.在子进程里,以新程序取代Shell复制并执行(exec),此时父进程进入休眠,等待子进程执行完毕;

4.子进程执行完毕后,父进程接着从终端读取下一条命令。

二.Linux Shell的变量

  Linux shell并不对变量区分类型。一切值都是字符串,并且和变量名一样,值并没有字符长度限制。更加神奇的是,bash也允许比较操作和整数操作。其中关键因素是:变量中的字符串值是否为数字。

单双引号引用问题:单引号是强引用,双引号是弱引用(强引用就是禁止变量替换,弱引用就是可以进行变量替换)

eg:

$var=
echo '$var' #此处是单引号,故结果是$var
$var
echo "$var" #双引号,结果为123

在Shell世界中,变量可以是空值("NULL"值),就是不包含任何字符。但是在算术操作中,未初始化的变量为0。

eg:

echo "$uninit"            #未初始化变量
#此行为空,没有输出
let "$uninit+=5" #未初始化变量加5
echo "$uninit"

Linux Shell中的变量根据影响范围分为两种:局部变量和全局变量。

局部变量:可见范围为代码块或者函数中,且必须用local声明,否在在代码块中,也是全局可见。

全局变量:全局可见,不需要添加修饰词,环境变量是全局变量的一种。

eg:

#! /bin/bash
#测试全局变量和局部变量的适用范围
num=
func1()
{
num= #在代码中声明的变量
echo $num
}
func2()
{
local num= #声明为局部变量
echo $num
}
echo $num #显示初始时的num变量
func1()
echo $num
func2()
echo $num

运行结果:


三.环境变量的相关操作

  每次当运行一个Shell时,它都会创建适合自己的环境变量的shell变量。或者更新添加一个新的环境变量的时候,这个Shell都会立即更新它自己的环境,让所有后继子进程都能够继承这个环境变量。

  一个脚本只能够export变量到这个脚本所产生的子进程,也就说只能对这个脚本所产生的命令和进程起作用。如果脚本是从命令行中被调用的,那么这个脚本export的变量是不能够影响命令行环境的,即子进程是不能够export变量来影响产生自己的父进程的环境的。但是source命令执行脚本时,因为没有子进程的产生,故可以立即同步执行环境。

export命令用于设置或者显示当前Shell进程的环境变量,作用时间仅仅是当前Shell消亡前。

语法:export  [-fnp]  [变量名称]=[变量值]

-f:代表[变量名称]中为函数名称。

-n:删除指定的变量。(变量实际上并未删除,只是不输出到后续指令的执行环境中)

-p:列出所有的Shell赋予程序的环境变量。

如若想永久设置环境变量,在启动文件(/etc/profile,/etc/bashrc)相对应的文件中进行设置。

eg:

#设置环境变量PATH
export PATH=/bin:/usr/bin:/usr/local/bin

env命令在未提供command时,显示所有的变量名称和值;提供command时,根据参数重建环境变量后,在新的环境中运行command。

语法:env   [OPTION]... [-]  [NAME=VALUE]...    [COMMAND  [ARG]...]

-i:不带环境变量启动(--ignore-environment)

-u:从环境变量中删除一个变量(--unset=NAME)

unset命令从当前Shell删除函数或者变量。

语法:unset  [-v] variable..

unset-f   function..

-v:默认选项,删除指定的变量。

-f:删除函数操作,参数为函数名称。

Env函数和set函数不同。Env函数显示的环境变量,而set函数显示的是所有本地变量,包括用户定义的变量。

一些常用的环境变量有:

HOME:用户的专属目录,在Linux中用~扩展。

PATH:外部命令的搜索路径。

HISTSIZE:保存历史命令记录的太条数。

LOGNAME:当前用户的登录名。

HOSTNAME:主机的名称。

SHELL:当前用户使用shell的类型。

MAIL:当前用户的邮件存放目录。

LANG/LANGUAGE:语言相关的环境变量,使用多种语言的用户可以修改此变量。

PS1/PS2:PS1是基本提示符,对于root用户是#,对于普通用户是$。PS2是负数提示符默认是>。

一般来说,PATH变量中存储路径以:分开,路径中至少包含/bin和/usr/bin这两个目录。当Shell接收到一个命令非内部命令时,也没有给出完整路径时,Shell则在Path变量中从左到右依次搜索目录,如果有一个命令在两个不同目录中都有,则在前面一个会被执行。

Shell编程基础知识(一)的更多相关文章

  1. shell编程基础知识

    什么是shell shell是一个命令解释器,它在操作系统的最外层,负责直接与用户对话,把用户的输入解释给操作系统,并处理各种各样的操作系统的输出结果,输出屏幕返回给用户 shell对话方式 交互的方 ...

  2. shell编程基础知识3

    1.Linux下scp的用法 scp就是secure copy,一个在linux下用来进行远程拷贝文件的命令.有时我们需要获得远程服务器上的某个文件,该服务器既没有配置ftp服务器,也没有做共享,无法 ...

  3. shell编程基础知识2

    1.一维数组 定义:A={test1 test2 test3} 引用:echo ${A[0]} 表示引用第一个数组变量 echo ${A[1]} 表示引用第二个数组变量 显示数据参数:echo ${A ...

  4. SHELL脚本编程基础知识

    SHELL脚本编程基础知识 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. Linux之父Linus有一句话很经典:"Talk is cheap, show me the ...

  5. Shell编程(二)——shell的基础知识及常用命令

    shell的基础知识 一.bash有以下特点: 1.记录命令历史 2.指令和文件名补全 3.别名 alias rm='rm -i' 4.通配符 * 0个或多个字符 ?​匹配一个字符 5 输入输出重定向 ...

  6. 【转】Shell编程基础篇-上

    [转]Shell编程基础篇-上 1.1 前言 1.1.1 为什么学Shell Shell脚本语言是实现Linux/UNIX系统管理及自动化运维所必备的重要工具, Linux/UNIX系统的底层及基础应 ...

  7. TCP与UDP比较 以及并发编程基础知识

    一.tcp比udp真正可靠地原因 1.为什么tcp比udp传输可靠地原因: 我们知道在传输数据的时候,数据是先存在操作系统的缓存中,然后发送给客户端,在客户端也是要经过客户端的操作系统的,因为这个过程 ...

  8. 【Shell 编程基础第二部分】Shell里的流程控制、Shell里的函数及脚本调试方法!

    http://blog.csdn.net/xiaominghimi/article/details/7603003 本站文章均为李华明Himi原创,转载务必在明显处注明:转载自[黑米GameDev街区 ...

  9. 什么是Shell?Shell脚本基础知识详细介绍

    这篇文章主要介绍了什么是Shell?Shell脚本基础知识介绍,本文是一篇Shell脚本入门文章,在本文你可学到什么是Shell.有多少种Shell.一个Shell脚本代码实例,需要的朋友可以参考下 ...

随机推荐

  1. 安装LoadRunner时提示缺少vc2005_sp1_with_atl_fix_redist解决方案

    操作系统重装后,安装LoadRunner11时,会报缺少vc2005_sp1_with_atl_fix_redist错误,类似下图所示: LR自动安装失败,在网上下载此组件安装后依然提示此信息,最终解 ...

  2. win10 uwp 商业游戏 1.2.1

    上一个游戏已经告诉大家如何写多个游戏,现在继续写这个无聊的游戏 希望大家在看这篇文章之前先看win10 uwp 商业游戏,在这个文章告诉了大家如何创建游戏. 修改数值 可以从上一篇的博客的游戏看到升级 ...

  3. SQL Server 分页编号的另一种方式

    今天看书讲T-SQL,看到了UNBOUNDED PRECEDING,就想比对下ROW_NUMBER()的运行速度. sql及相关的结果如下,数据库中的数据有5W+. ROW_NUMBER(): SET ...

  4. mysql写注释的几种方法

    MySQL的注释风格总的来说有三种.它们分别是 1.单行注释可以用"#" select 1 as cname; #this is a comment +-------+ | cna ...

  5. ES6之Object.assign()详解

    译者按: 这篇博客将介绍ES6新增的Object.assign()方法. 原文: ECMAScript 6: merging objects via Object.assign() 译者: Funde ...

  6. 反向ajax实现原理

    留言板显示留言一直刷新,那么实现原理是怎么样的? 一般发送留言就是通过正常的ajax向服务器发送数据,而实时显示留言就需要用到轮询了. 什么是轮询:就是使用定时器,每隔固定的时间从客户端向服务器发起请 ...

  7. 使用eclipse初步学习vue.js基础==》v-for的使用 ②

    一.步骤演示 1. 新建一个jsp文件 2. 把vue.js放到Web的js目录下 3. 在jsp中引入vue.js <script src="${pageContext.reques ...

  8. vue从入门到进阶:过滤器filters(五)

    Vue.js 允许你自定义过滤器,可被用于一些常见的文本格式化.过滤器可以用在两个地方:双花括号插值和 v-bind 表达式 (后者从 2.1.0+ 开始支持).过滤器应该被添加在 JavaScrip ...

  9. POJ 2484 A Funny Game(智商博弈)

    Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 6397   Accepted: 3978 Description Alice ...

  10. Vue 组件之间传值

    一.父组件向子组件传递数据 在 Vue 中,可以使用 props 向子组件传递数据. 子组件部分: 这是 header.vue 的 HTML 部分,logo 是在 data 中定义的变量. 如果需要从 ...