鸟哥私房菜---认识与学习bash
来源:互联网 发布:淘宝代充微信红包 编辑:程序博客网 时间:2024/06/01 07:16
- 变量的配置守则
- 变量与变量内容以一个等号『=』来连结,如下所示:
『myname=VBird』 - 等号两边不能直接接空格符,如下所示为错误:
『myname = VBird』或『myname=VBird Tsai』 - 变量名称只能是英文字母与数字,但是开头字符不能是数字,如下为错误:
『2myname=VBird』 - 变量内容若有空格符可使用双引号『"』或单引号『'』将变量内容结合起来,但
- 双引号内的特殊字符如 $等,可以保有原本的特性,如下所示:
『var="lang is $LANG"』则『echo $var』可得『lang is en_US』 - 单引号内的特殊字符则仅为一般字符 (纯文本),如下所示:
『var='lang is $LANG'』则『echo $var』可得『lang is $LANG』
- 双引号内的特殊字符如 $等,可以保有原本的特性,如下所示:
- 可用转义字符『 \』将特殊符号(如 [Enter], $, \, 空格符, '等)变成一般字符;
- 在一串命令中,还需要藉由其他的命令提供的信息,可以使用反单引号『`命令`』或『$(命令)』。特别注意,那个 ` 是键盘上方的数字键 1 左边那个按键,而不是单引号! 例如想要取得核心版本的配置:
『version=$(uname -r)』再『echo $version』可得『2.6.18-128.el5』 - 若该变量为扩增变量内容时,则可用 "$变量名称" 或 ${变量} 累加内容,如下所示:
『PATH="$PATH":/home/bin』 - 若该变量需要在其他子程序运行,则需要以 export来使变量变成环境变量:
『export PATH』 - 通常大写字符为系统默认变量,自行配置变量可以使用小写字符,方便判断 (纯粹依照使用者兴趣与嗜好) ;
- 取消变量的方法为使用 unset :『unset 变量名称』例如取消 myname 的配置:
『unset myname』
底下让鸟哥举几个例子来让你试看看,就知道怎么配置好你的变量啰!
范例一:配置一变量 name ,且内容为 VBird
[root@www ~]# 12name=VBird
-bash: 12name=VBird: command not found <==屏幕会显示错误!因为不能以数字开头!
[root@www ~]# name = VBird <==还是错误!因为有空白!
[root@www ~]# name=VBird <==OK的啦!
范例二:承上题,若变量内容为 VBird's name 呢,就是变量内容含有特殊符号时:
[root@www ~]# name=VBird's name
# 单引号与双引号必须要成对,在上面的配置中仅有一个单引号,因此当你按下 enter后,
# 你还可以继续输入变量内容。这与我们所需要的功能不同,失败啦!
# 记得,失败后要复原请按下 [ctrl]-c结束!
[root@www ~]# name="VBird's name" <==OK的啦!
# 命令是由左边向右找→,先遇到的引号先有用,因此如上所示,单引号会失效!
[root@www ~]# name='VBird's name' <==失败的啦!
# 因为前两个单引号已成对,后面就多了一个不成对的单引号了!因此也就失败了!
[root@www ~]# name=VBird\'s\ name <==OK的啦!
# 利用反斜杠 (\)跳脱特殊字符,例如单引号与空格键,这也是 OK 的啦!
范例三:我要在 PATH 这个变量当中『累加』:/home/dmtsai/bin 这个目录
[root@www ~]# PATH=$PATH:/home/dmtsai/bin
[root@www ~]# PATH="$PATH":/home/dmtsai/bin
[root@www ~]# PATH=${PATH}:/home/dmtsai/bin
# 上面这三种格式在 PATH里头的配置都是 OK 的!但是底下的例子就不见得啰!
范例四:承范例三,我要将 name 的内容多出 "yes" 呢?
[root@www ~]# name=$nameyes
# 知道了吧?如果没有双引号,那么变量成了啥?name的内容是 $nameyes 这个变量!
# 呵呵!我们可没有配置过 nameyes这个变量吶!所以,应该是底下这样才对!
[root@www ~]# name="$name"yes
[root@www ~]# name=${name}yes <==以此例较佳!
范例五:如何让我刚刚配置的 name=VBird 可以用在下个 shell 的程序?
[root@www ~]# name=VBird
[root@www ~]# bash <==进入到所谓的子程序
[root@www ~]# echo $name <==子程序:再次的 echo一下;
<==嘿嘿!并没有刚刚配置的内容喔!
[root@www ~]# exit <==子程序:离开这个子程序
[root@www ~]# export name
[root@www ~]# bash <==进入到所谓的子程序
[root@www ~]# echo $name <==子程序:在此运行!
VBird <==看吧!出现配置值了!
[root@www ~]# exit <==子程序:离开这个子程序
变量键盘读取、数组与宣告: read, array,declare
我们上面提到的变量配置功能,都是由命令列直接配置的,那么,可不可以让用户能够经由键盘输入?什么意思呢?是否记得某些程序运行的过程当中,会等待使用者输入 "yes/no"之类的信息啊?在 bash里面也有相对应的功能喔!此外,我们还可以宣告这个变量的属性,例如:数组或者是数字等等的。底下就来看看吧!
- read
要读取来自键盘输入的变量,就是用 read这个命令了。这个命令最常被用在 shell script的撰写当中,想要跟使用者对谈?用这个命令就对了。关于 script的写法,我们会在第十三章介绍,底下先来瞧一瞧 read的相关语法吧!
[root@www ~]# read [-pt] variable
选项与参数:
-p :后面可以接提示字符!
-t :后面可以接等待的『秒数!』这个比较有趣~不会一直等待使用者啦!
范例一:让用户由键盘输入一内容,将该内容变成名为 atest 的变量
[root@www ~]# read atest
This is a test <==此时光标会等待你输入!请输入左侧文字看看
[root@www ~]# echo $atest
This is a test <==你刚刚输入的数据已经变成一个变量内容!
范例二:提示使用者 30 秒内输入自己的大名,将该输入字符串作为名为 named 的变量内容
[root@www ~]# read -p "Please keyin your name: " -t 30 named
Please keyin your name: VBird Tsai <==注意看,会有提示字符喔!
[root@www ~]# echo $named
VBird Tsai <==输入的数据又变成一个变量的内容了!
read 之后不加任何参数,直接加上变量名称,那么底下就会主动出现一个空白行等待你的输入(如范例一)。如果加上 -t 后面接秒数,例如上面的范例二,那么 30秒之内没有任何动作时,该命令就会自动略过了~如果是加上 -p,嘿嘿!在输入的光标前就会有比较多可以用的提示字符给我们参考!在命令的下达里面,比较美观啦! ^_^
- declare / typeset
declare 或 typeset是一样的功能,就是在『宣告变量的类型』。如果使用 declare后面并没有接任何参数,那么 bash就会主动的将所有的变量名称与内容通通叫出来,就好像使用 set一样啦!那么 declare还有什么语法呢?看看先:
[root@www ~]# declare [-aixr] variable
选项与参数:
-a :将后面名为 variable的变量定义成为数组 (array) 类型
-i :将后面名为 variable的变量定义成为整数数字 (integer) 类型
-x :用法与 export一样,就是将后面的 variable 变成环境变量;
-r :将变量配置成为 readonly类型,该变量不可被更改内容,也不能 unset
范例一:让变量 sum 进行 100+300+50 的加总结果
[root@www ~]# sum=100+300+50
[root@www ~]# echo $sum
100+300+50 <==咦!怎么没有帮我计算加总?因为这是文字型态的变量属性啊!
[root@www ~]# declare -i sum=100+300+50
[root@www ~]# echo $sum
450 <==瞭乎??
由于在默认的情况底下, bash对于变量有几个基本的定义:
- 变量类型默认为『字符串』,所以若不指定变量类型,则 1+2 为一个『字符串』而不是『计算式』。 所以上述第一个运行的结果才会出现那个情况的;
- bash 环境中的数值运算,默认最多仅能到达整数形态,所以 1/3 结果是 0;
现在你晓得为啥你需要进行变量宣告了吧?如果需要非字符串类型的变量,那就得要进行变量的宣告才行啦!底下继续来玩些其他的 declare功能。
范例二:将 sum 变成环境变量
[root@www ~]# declare -x sum
[root@www ~]# export | grep sum
declare -ix sum="450" <==果然出现了!包括有 i与 x 的宣告!
范例三:让 sum 变成只读属性,不可更动!
[root@www ~]# declare -r sum
[root@www ~]# sum=tesgting
-bash: sum: readonly variable <==老天爷~不能改这个变量了!
范例四:让 sum 变成非环境变量的自定义变量吧!
[root@www ~]# declare +x sum <==将 - 变成 + 可以进行『取消』动作
[root@www ~]# declare -p sum <== -p可以单独列出变量的类型
declare -ir sum="450" <==看吧!只剩下 i, r的类型,不具有 x 啰!
declare 也是个很有用的功能~尤其是当我们需要使用到底下的数组功能时,他也可以帮我们宣告数组的属性喔!不过,老话一句,数组也是在 shell script比较常用的啦!比较有趣的是,如果你不小心将变量配置为『只读』,通常得要注销再登陆才能复原该变量的类型了! @_@
- 数组 (array) 变量类型
某些时候,我们必须使用数组来宣告一些变量,这有什么好处啊?在一般人的使用上,果然是看不出来有什么好处的!不过,如果您曾经写过程序的话,那才会比较了解数组的意义~数组对写数值程序的设计师来说,可是不能错过学习的重点之一哩!好!不啰唆~那么要如何配置数组的变量与内容呢?在 bash 里头,数组的配置方式是:
var[index]=content
意思是说,我有一个数组名为 var,而这个数组的内容为 var[1]=小明, var[2]=大明, var[3]=好明 ....等等,那个 index就是一些数字啦,重点是用中刮号 ([ ])来配置的。目前我们 bash提供的是一维数组。老实说,如果您不必写一些复杂的程序,那么这个数组的地方,可以先略过,等到有需要再来学习即可!因为要制作出数组,通常与循环或者其他判断式交互使用才有比较高的存在意义!
范例:配置上面提到的 var[1] ~ var[3] 的变量。
[root@www ~]# var[1]="small min"
[root@www ~]# var[2]="big min"
[root@www ~]# var[3]="nice min"
[root@www ~]# echo "${var[1]}, ${var[2]}, ${var[3]}"
small min, big min, nice min
数组的变量类型比较有趣的地方在于『读取』,一般来说,建议直接以 ${数组}的方式来读取,比较正确无误的啦!
与文件系统及程序的限制关系: ulimit
想象一个状况:我的 Linux主机里面同时登陆了十个人,这十个人不知怎么搞的,同时开启了 100个文件,每个文件的大小约 10MBytes,请问一下,我的 Linux主机的内存要有多大才够? 10*100*10 = 10000 MBytes = 10GBytes ...老天爷,这样,系统不挂点才有鬼哩!为了要预防这个情况的发生,所以我们的 bash是可以『限制用户的某些系统资源』的,包括可以开启的文件数量,可以使用的 CPU时间,可以使用的内存总量等等。如何配置?用 ulimit吧!
[root@www ~]# ulimit [-SHacdfltu] [配额]
选项与参数:
-H :hard limit,严格的配置,必定不能超过这个配置的数值;
-S :soft limit,警告的配置,可以超过这个配置值,但是若超过则有警告信息。
在配置上,通常 soft会比 hard 小,举例来说,soft 可配置为 80 而 hard
配置为 100,那么你可以使用到 90 (因为没有超过 100),但介于 80~100 之间时,
系统会有警告信息通知你!
-a :后面不接任何选项与参数,可列出所有的限制额度;
-c :当某些程序发生错误时,系统可能会将该程序在内存中的信息写成文件(除错用),
这种文件就被称为核心文件(core file)。此为限制每个核心文件的最大容量。
-f :此 shell可以创建的最大文件容量(一般可能配置为 2GB)单位为 Kbytes
-d :程序可使用的最大断裂内存(segment)容量;
-l :可用于锁定 (lock)的内存量
-t :可使用的最大 CPU时间 (单位为秒)
-u :单一用户可以使用的最大程序(process)数量。
范例一:列出你目前身份(假设为root)的所有限制数据数值
[root@www ~]# ulimit -a
core file size (blocks, -c) 0 <==只要是 0就代表没限制
data seg size (kbytes, -d) unlimited
scheduling priority (-e) 0
file size (blocks, -f) unlimited <==可创建的单一文件的大小
pending signals (-i) 11774
max locked memory (kbytes, -l) 32
max memory size (kbytes, -m) unlimited
open files (-n) 1024 <==同时可开启的文件数量
pipe size (512 bytes, -p) 8
POSIX message queues (bytes, -q) 819200
real-time priority (-r) 0
stack size (kbytes, -s) 10240
cpu time (seconds, -t) unlimited
max user processes (-u) 11774
virtual memory (kbytes, -v) unlimited
file locks (-x) unlimited
范例二:限制用户仅能创建 10MBytes 以下的容量的文件
[root@www ~]# ulimit -f 10240
[root@www ~]# ulimit -a
file size (blocks, -f) 10240<==最大量为10240Kbyes,相当10Mbytes
[root@www ~]# dd if=/dev/zero of=123 bs=1M count=20
File size limit exceeded <==尝试创建 20MB的文件,结果失败了!
还记得我们在第八章 Linux磁盘文件系统里面提到过,单一 filesystem能够支持的单一文件大小与 block的大小有关。例如 block size为 1024 byte时,单一文件可达 16GB 的容量。但是,我们可以用 ulimit来限制使用者可以创建的文件大小喔!利用 ulimit -f就可以来配置了!例如上面的范例二,要注意单位喔!单位是 Kbytes。若改天你一直无法创建一个大容量的文件,记得瞧一瞧 ulimit的信息喔!
Tips:
想要复原 ulimit 的配置最简单的方法就是注销再登陆,否则就是得要重新以 ulimit配置才行!不过,要注意的是,一般身份使用者如果以 ulimit配置了 -f 的文件大小,那么他『只能继续减小文件容量,不能添加文件容量喔!』另外,若想要管控使用者的 ulimit限值,可以参考第十四章的 pam 的介绍。
通配符与特殊符号
在 bash的操作环境中还有一个非常有用的功能,那就是通配符 (wildcard)!我们利用 bash处理数据就更方便了!底下我们列出一些常用的通配符喔:
符号
意义
*
代表『 0 个到无穷多个』任意字符
?
代表『一定有一个』任意字符
[ ]
同样代表『一定有一个在括号内』的字符(非任意字符)。例如 [abcd] 代表『一定有一个字符, 可能是 a, b, c, d 这四个任何一个』
[ - ]
若有减号在中括号内时,代表『在编码顺序内的所有字符』。例如 [0-9] 代表 0 到 9 之间的所有数字,因为数字的语系编码是连续的!
[^ ]
若中括号内的第一个字符为指数符号 (^) ,那表示『反向选择』,例如 [^abc] 代表 一定有一个字符,只要是非 a, b, c 的其他字符就接受的意思。
接下来让我们利用通配符来玩些东西吧!首先,利用通配符配合 ls找檔名看看:
[root@www ~]# LANG=C <==由于与编码有关,先配置语系一下
范例一:找出 /etc/ 底下以 cron 为开头的档名
[root@www ~]# ll -d /etc/cron* <==加上 -d是为了仅显示目录而已
范例二:找出 /etc/ 底下文件名『刚好是五个字母』的文件名
[root@www ~]# ll -d /etc/????? <==由于 ?一定有一个,所以五个 ? 就对了
范例三:找出 /etc/ 底下文件名含有数字的文件名
[root@www ~]# ll -d /etc/*[0-9]* <==记得中括号左右两边均需 *
范例四:找出 /etc/ 底下,档名开头非为小写字母的文件名:
[root@www ~]# ll -d /etc/[^a-z]* <==注意中括号左边没有 *
范例五:将范例四找到的文件复制到 /tmp 中
[root@www ~]# cp -a /etc/[^a-z]* /tmp
除了通配符之外,bash环境中的特殊符号有哪些呢?底下我们先汇整一下:
符号
内容
#
批注符号:这个最常被使用在 script 当中,视为说明!在后的数据均不运行
\
跳脱符号:将『特殊字符或通配符』还原成一般字符
|
管线 (pipe):分隔两个管线命令的界定(后两节介绍);
;
连续命令下达分隔符:连续性命令的界定 (注意!与管线命令并不相同)
~
用户的家目录
$
取用变量前导符:亦即是变量之前需要加的变量取代值
&
工作控制 (job control):将命令变成背景下工作
!
逻辑运算意义上的『非』 not 的意思!
/
目录符号:路径分隔的符号
>, >>
数据流重导向:输出导向,分别是『取代』与『累加』
<, <<
数据流重导向:输入导向 (这两个留待下节介绍)
' '
单引号,不具有变量置换的功能
" "
具有变量置换的功能!
` `
两个『 ` 』中间为可以先运行的命令,亦可使用 $( )
( )
在中间为子 shell 的起始与结束
{ }
在中间为命令区块的组合!
自己写的一个shell脚本,可以得到ipaddress.
#!/bin/bash
allinfo=`ifconfig | grep 192.*| awk '{print $2}'`
echo $allinfo
更改权限什么的都不用说了吧...
- 鸟哥私房菜---认识与学习bash
- 认识与学习bash------鸟哥的Linux私房菜
- 鸟哥私房菜 第十一章 认识与学习bash
- 学习鸟哥私房菜(六)之 认识与学习bash
- 鸟哥的 Linux 私房菜第11章-认识与学习 BASH 学习笔记
- 【鸟哥的Linux私房菜】认识和学习BASH
- 鸟哥私房菜--第11章 认识与学习BASH(2)
- 鸟哥私房菜--第11章 认识与学习BASH(3)
- 转载:鸟哥的linux私房菜-认识与学习 BASH
- 鸟哥的私房菜--第十一章:认识与学习bash
- 鸟哥的Linux私房菜(基础篇)- 第十一章、认识与学习 BASH
- 鸟哥的Linux私房菜读书笔记-第11章-认识与学习bash
- 鸟哥的Linux私房菜基础学习篇(第三版)之第十一章:认识与学习BASH
- 我的《鸟哥的Linux私房菜》笔记(八)认识与学习 BASH——变量
- 我的《鸟哥的Linux私房菜》笔记(九)认识与学习 BASH(二)
- 第32周-鸟哥的Linux私房菜基础篇第三版-第十一章 认识与学习BASH
- Linux鸟哥私房菜学习笔记_第十一章 学习和认识BASH
- 鸟哥的linux私房菜读书笔记--认识和学习bash
- Win32 Series - Modal Dialog Boxes
- UISearchDisplayController 的使用
- vi中set命令
- CSDN博文精选:Android系列开发博客资源汇总
- 分享中谷教育-Python视频教程(完整版) http://t.cn/zQ39jof
- 鸟哥私房菜---认识与学习bash
- Eclipse快捷键大全(转载)
- Maven的pom.xml中的dependency部分,如何写
- 基于Android客户端的人人网开放平台开发系列教程
- efficient c++,单线程内存池
- HDU_2092 整数解
- linux 下查看机器是cpu是几核的
- Tfield Type type
- Android Dalvik 虚拟机 .