shell 入门基础三

    linux shell 编程

1什么是bash shell 变量


shell变量可分为两类:

局部变量和环境变量。

局部变量只在创建它们的shell中可用。而环境变量则可以在创建它们的shell及其派生出来的任意子进程中使用。有些变量是用户创建的,其他的则是专用shell变量。变量名必须以字母或下划线字符开头。其余的字符可以是字母、数字(0~9)或下划线字符。任何其他的字符都标志着变量名的终止。名字是大小写敏感的。给变量赋值时,等号周围不能有任何空白符。为了给变量赋空值,可以在等号后跟一个换行符。用set命令可以查看所有的变量,unset var命令可以清除变量var,var相当于没有定义过。readonly var可以把var变为只读变量,定义之后不能对var进行任何更改。对shell变量的引用方式很多,用这些方式可以方便的获取shell变量的值,变量值的长度,变量的一个字串,变量被部分替换后的值等等。shell变量常见引用方式如下



2 环境变量
环境变量的定义方法如下:
var=value
export var
shell在初始化的时候会在执行profile等初始化脚本,脚本中定义了一些环境变量,这些变量会在创建子进程时传递给子进程。
用env命令可以查看当前的环境变量。常用的系统环境变量如下:
_(下划线) 上一条命令的最后一个参数
BASH 展开为调用bash实例时使用的全路径名
CDPATH cd命令的搜索路径。它是以冒号分隔的目录列表,shell通过它来搜索cd命令指定的目标目录。例如.:~:/usr
EDITOR 内置编辑器emacs、gmacs或vi的路径名
ENV 每一个新的bash shell(包括脚本)启动时执行的环境文件。通常赋予这个变量的文件名是.bashrc。
EUID 展开为在shell启动时被初始化的当前用户的有效ID
GROUPS 当前用户所属的组
HISTFILE 指定保存命令行历史的文件。默认值是~/.bash_history。如果被复位,交互式shell退出时将不保存命令行历史
HISTSIZE 记录在命令行历史文件中的命令数。默认是500
HOME 主目录。未指定目录时,cd命令将转向该目录
IFS 内部字段分隔符,一般是空格符、制表符和换行符,用于由命令替换,循环结构中的表和读取的输入产生的词的字段划分
LANG 用来为没有以LC_开头的变量明确选取的种类确定locale类
OLDPWD 前一个工作目录
PATH 命令搜索路径。一个由冒号分隔的目录列表,shell用它来搜索命令,一个普通值为 /usr/gnu/bin:/usr/local/bin:/usr/ucb:/usr/bin
PPID 父进程的进程ID
PS1 主提示符串,默认值是$
PS2 次提示符串,默认值是>
PS3 与select命令一起使用的选择提示符串,默认值是#?
PS4 当开启追踪时使用的调试提示符串,默认值是+。追踪可以用set –x开启
PWD 当前工作目录。由cd设置
RANDOM 每次引用该变量,就产生一个随机整数。随机数序列可以通过给RANDOM赋值来初始化。如果RANDOM被复位,即使随后再设置,它也将失去特定的属性
REPLY 当没有给read提供参数时设置
SHELL 当调用shell时,它扫描环境变量以寻找该名字。shell给PATH、PS1、PS2、MAILCHECK和IFS设置默认值。HOME和MAIL由login(1)设置
SHELLOPTS 包含一列开启的shell选项,比如braceexpand、hashall、monitor等
UID 展开为当前用户的用户ID,在shell启动时初始化
3 数值变量
shell中默认把变量值当作字符串,例如:
age=22
age=${age}+1
echo ${age}
输出结果为22+1,而不是23,因为shell将其解释为字符串,而不是数学运算。
可以用let命令使其进行数学运算,例如:
let age=${age}+1
也可以用declare把变量定义为整型。例如:
declare -i age=22
这里就用 -i 选项把age定义为整型的了。此后每次运算,都把age的右值识别为算术表达式或数字。
4 数组
在shell中可以使用数组,例如:
array[0]=0
array[1]=1
array[2]=2
则array就是一个数组,也可以这样给数组初始化:
array=(0 1 2) // 元素之间以空格分隔
可以通过 ${array[$i]}来访问array中某个元素,${array[*]} 的返回值即数组的所有元素组成的串,${#array[*]} 的返回值即数组的元素个数,${array[*]:0:2} 返回第一个和第二个元素组成的串。0表示开始的位置,2表示要返回的元素个数,开始位置可以为0-2(0减去2)之类的,表示从倒数第二个元素开始。
下面写个稍微复杂点的例子:

1 #!/bin/bash
2 for ((i=0; i<100; i++))
3 do
4 array[$i]=$i
5 done
6 for ((i=0; i<100; i++))
7 do
8 echo ${array[$i]}
9 done

如果要使用二维数组甚至三维数组该怎么实现呢,那就需要用eval命令来模拟数组的功能了。
eval命令的作用是扫描命令两次再执行,如果不使用eval,只扫描一次,然后执行。看个例子:
root@suse :~$ name=Barry
root@suse :~$ $name=hello
Barry=hello: command not found
为什么第二句给Barry变量赋值会出错呢?从报错信息可以发现shell并没有识别这是个赋值语句,而是把Barry=hello当作一个命令来执行,当然会报错。为什么不能识别这是赋值语句呢?第一次扫描时,因为扫描到$符号,所以不能把这句当作赋值语句,赋值语句的左边总是一个变量名,而不应该是$开头的。所以第一次扫描仅仅识别了$name变量,并做了替换,而并没有认识到赋值语句。
如果使用eval $name=hello呢?
root@suse :~$ name=Barry
root@suse :~$ $name=hello
Barry=hello: command not found
root@suse :~$ eval $name=hello
[email protected]:~$ echo $Barry
hello
可见使用了eval之后,对 $name=hello 第一次扫描替换了$name,没有识别赋值语句,第二次扫描识别是赋值语句,然后执行。现在大约可以想到怎样用eval实现二维数组了。
下面实现的二维数组每一行代表一个人的信息记录,包括姓名,年龄。

 1 for ((i=0; i<2; i++))
 2 do
 3 for ((j=0; j<2; j++))
 4 do 
 5 read man$i$j
 6 done
 7 done
 8 echo "next print:"
 9 for ((i=0; i<2; i++))
10 do
11 for ((j=0; j<2; j++))
12 do 
13 eval echo -n "\$man$i$j:"
14 done
15 printf "\n"
16 done

5 特殊变量
$0:当前脚本的文件名
$num:num为从1开始的数字,$1是第一个参数,$2是第二个参数,${10}是第十个参数
$#:传入脚本的参数的个数
$*:所有的位置参数(作为单个字符串) 
[email protected]:所有的位置参数(每个都作为独立的字符串)。
$?:当前shell进程中,上一个命令的返回值,如果上一个命令成功执行则$?的值为0,否则为其他非零值,常用做if语句条件
$$:当前shell进程的pid
$!:后台运行的最后一个进程的pid
$-:显示shell使用的当前选项
$_:之前命令的最后一个参数

shell 入门基础三

时间: 2024-12-21 13:59:44

shell 入门基础三的相关文章

Linux shell入门基础(六)

六.Shell脚本编程详解 将上述五部分的内容,串联起来,增加对Shell的了解 01.shell脚本 shell: # #perl #python #php #jsp 不同的脚本执行不同的文本,执行的角色是不一样的: #shell scripts(UNIX Like系统的原则有一条:程序越短越好) #bash csh tcsh ksh #which startx(查看文件的路径) /usr/X11R6/bin/startx #vi `which startx` #!/bin/sh …… #vi

shell 入门基础一

1,man命令是一个帮助我们,快速掌握某个命令的使用方法的命令,当然前提时我们安装了man命令模块,man命令的用法,man command,后面跟自己不了解的命令,如果你的系统没有安装,先执行命令,yum install man* 安装 2,cd命令,cd命令时linux目录下,切换路径的命令,主要用法是用来浏览文件系统,和遍历目录所需. 用法(一)cd  绝对路径 例如cd /etc/profile.d,cd /home等等 用法(二)cd  相对路径 例如cd ../ 上一级目录 cd .

C#入门基础三

封装:简化用户接口,隐藏实现细节. get{return 属性值:} set{属性值 = value:} 继承:子类继承父类所有非私有成员.继承具有传递性,单根性. 隐式继承:用引号(:)实现. 显示继承:关键字(:base)实现. 显示继承与隐式继承的区别: 简单来说就是说 如果继承的一堆接口中 有2个或者2个以上的接口有同名的属性/方法,而它们又是不同的功能的话,你就应该显示继承接口 反过来 随意(一般用隐式,因为可以偷懒) 如果你很犹豫应该用哪一种 而又必须保证不会出问题 直接使用显式 方

mybatis入门基础(三)----SqlMapConfig.xml全局配置文件解析

阅读目录 一:SqlMapConfig.xml配置文件的内容和配置顺序如下 二:properties属性 三:settings全局参数配置 四:typeAiases(别名)--重点掌握 五:typeHandlers(类型处理器) 六:mappers(映射配置) 回到顶部 一:SqlMapConfig.xml配置文件的内容和配置顺序如下 properties(属性) settings(全局配置参数) typeAiases(类型别名) typeHandlers(类型处理器) objectFactor

shell 入门基础

一. Shell变量 1. 变量可分为两类: 环境变量(全局变量) 和 局部变量 . 环境变量 : 所有的环境变量都是系统全局变量,可用于所有子进程中,这包括编辑器.shell脚本和各类应用 . 环境变量可以在命令行中设置,但用户退出时这些变量值也会丢失,因此最好在用户家目录下的.bash_profile文件中或全局配置 /etc/bashrc./etc/profile文件或者/etc/profile.d/ 中定义 . 将环境变量放入profile文件中 , 每次用户登录时这些变量值都将被初始化

Linux shell入门基础(八)

八.shell脚本sed&awk 01.sed的使用 流编辑器-Steam Editor #ed /etc/passwd 1,10p …… 1s/root/byf/p(替换root为byf) #sed -e 's/root/byf/g' /etc/passwd (功能同上) 只是显示出来的内容更改 #sed -e 's/root/byf/g' /etc/passwd > /tmp/a #cp /tmp/a /etc/passwd #sed -n -e '/\<byf\>/p(打印

shell入门基础&amp;常见命令及用法

shell shell是一个命令解释器,实际是一个程序,/bin/bash,linux中所有的命令都由它来解释,有自己的语法 shell脚本 以.sh结尾 shell语法+linux命令 注释: 单行注释 : # 多行注释 : :<<c   c shell执行方式 bash /path/to/script-name  或   /bin/bash /path/to/script-name    (强烈推荐使用) /path/to/script-name   或  ./script-name   

Shell入门基础

Shell的Helloworld #!/bin/bash echo "helloworld taosir" 执行方式 方式一:用 bash 或 sh 的相对或绝对路径(不用赋予脚本+x权限) bash 文件相对或绝对地址 sh 文件相对或绝对地址 方式二:采用输入脚本脚本的绝对路径或相对路径(必须具有可操作权限+x)赋予脚本文件+x权限 chmod 777 文件名 注意: 第一种方式本质是bash解析器帮你执行脚本,所以脚本本身不需要执行权限 第二中方式本质是脚本需要自己执行,所以需要

Objective-C 快速入门--基础(三)

1.OC有几种方式创建字符串对象?如:如何创建一个字符串对象:@“Baby”. OC中有3种方式创建字符串对象: 示例:main.m文件中: 控制台输出: 2.OC中如何获取字符串的长度? OC中获取字符串的长度要用“length”; 示例:mian.m文件中: 控制台输出: 3.判断字符串是否以指定字符串开始或结束:用代码举例. 示例:main.m文件中: 控制台输出: 4.查找某个字符串在另一个字符串中的范围. 如查找在字符串@”爱你”在@”我爱你们”中的范围. 示例:main.m文件中: