1. shell script 是利用 shell 的功能所写的一个『程序 (program)』,这个程序是使用纯文本文件,将一些 shell 的语法与指令(含外部指令)写在里面, 搭配正则表达式、管道命令与数据流重导向等功能,以达到我们所想要的处理目的。
2. Linux 系统的服务 (services) 启动的接口是在 /etc/init.d/ 这个目录下,目录下的所有档案都是 scripts ; 另外,包括开机 (booting) 过程也都是利用 shell script 来帮忙搜寻系统的相关设定数据, 然后再代入各个服务的设定参数。
3. 在 shell script 的撰写中有以下注意事项:
1) 指令的执行是从上而下、从左而右的分析与执行;
2) 指令、选项与参数间的多个空白都会被忽略掉;
3) 空白行也将被忽略掉,并且 [tab] 按键同样视为空格键;
4) 如果读取到一个 Enter 符号 (CR) ,就尝试开始执行该行 (或该串) 命令;
5) 如果一行的内容太多,则可以使用『 \[Enter] 』来延伸至下一行;
6) 『 # 』可做为注释,任何加在 # 后面的资料将全部被视为注释文字而被忽略。
4. /bin/sh 其实就是 /bin/bash (连结档),使用 sh shell.sh 亦即告诉系统,我想要直接以 bash 的功能来执行 shell.sh 这个档案内的相关指令的意思,所以此时你的 shell.sh 只要有 r 的权限即可被执行,而我们也可以利用 sh 的参数,如 -n 及 -x 来检查与追踪 shell.sh 的语法是否正确。
5. script的第一行要用 #!/bin/bash 来宣告这个 script 使用的是哪个bash,那么当这个程序被执行时,他就能够加载 bash 的相关环境配置文件 (一般来说就是 non-login shell 的 ~/.bashrc), 并且执行 bash 来使script中的指令能够执行。
6. 一般来说,建议在script的开头部分用注释来说明该 script 的:
1) 内容与功能;
2) 版本信息;
3) 作者与联系方式;
4) 版权宣告方式
5) 建档日期;
6) 历史修改记录等等。
script内较特殊的指令,尽量使用『绝对路径』的方式来下达。由于每个人的环境都不相同,script 运行时需要的环境变量最好在script开头预先宣告与设定。
7. 可以利用 exit 这个指令来让程序中断,并且回传一个数值给系统。
8. echo 要加上 -e 的选项后就可以像printf一样显示引号内的特殊按键。(如\a让系统发出“咚"的一声)
9. 在数值的运算上,我们可以使用『 declare -i total=$first*$second 』 也可以使用 total=$(($first*$second))。
10. 直接指令下达 (不论是绝对路径/相对路径还是 $PATH 内),或者是利用 bash (或 sh) 来执行脚本时, 该 script 都会使用一个新的 bash 环境来执行脚本内的指令。使用这种执行方式时, 其实 script 是在子程序的 bash 内执行的,当子程序完成后,在子程序内的各项变量或动作将会结束而不会传回到父程序中。source 对 script 的执行会在父程序中执行,因此各项动作都会在原本的 bash 内生效。
11. test指令可以用来进行条件判断,并将判断结果放入返回值中:
测试选项 | 代表意义 |
关于某个档名的『文件类型』判断,如 test -e filename 表示存在否 | |
-e | 该『档名』是否存在 |
-f | 该『档名』是否存在且为文件(file) |
-d | 该『文件名』是否存在且为目录(directory) |
-b | 该『档名』是否存在且为一个 block device 装置 |
-c | 该『档名』是否存在且为一个 character device 装置 |
-S | 该『档名』是否存在且为一个 Socket 档案 |
-p | 该『档名』是否存在且为一个 FIFO (pipe) 档案 |
-L | 该『档名』是否存在且为一个连结档 |
关于档案的权限侦测,如 test -r filename 表示可读否 (但 root 权限常有例外) | |
-r | 侦测该档名是否存在且具有『可读』的权限 |
-w | 侦测该档名是否存在且具有『可写』的权限 |
-x | 侦测该档名是否存在且具有『可执行』的权限 |
-u | 侦测该文件名是否存在且具有『SUID』的属性 |
-g | 侦测该文件名是否存在且具有『SGID』的属性 |
-k | 侦测该文件名是否存在且具有『Sticky bit』的属性 |
-s | 侦测该档名是否存在且为『非空白档案』 |
两个档案间的比较,如: test file1 -nt file2 | |
-nt | (newer than)判断 file1 是否比 file2 新 |
-ot | (older than)判断 file1 是否比 file2 旧 |
-ef | 判断 file1 与 file2 是否为同一档案,即判断 hard link ,两个档案是否均指向同一 inode |
关于两个整数间的判断,例如 test n1 -eq n2 | |
-le | n1 小于 等于 n2 (less than or equal to) |
-ge | n1 大于等于 n2 (greater than or equal to) |
-lt | n1 小于 n2 (less than) |
-gt | n1 大于 n2 (greater than) |
-ne | 两数值不等 (not equal) |
-eq | 两数值相等 (equal) |
判断字符串的数据 | |
test -z string | 判断字符串是否为空 ?若 string 为空字符串,则为 true |
test -n string | 判断字符串是否非空 ?若 string 为空字符串,则为 false。(-n 亦可省略) |
test str1 = str2 | 判断 str1 是否等于 str2 ,若相等,则回传 true |
test str1 != str2 | 判断 str1 是否不等于 str2 ,若不相等,则回传 true |
多重条件判断,例如: test -r filename -a -x filename | |
-a | (and)两条件同时成立 |
-o | (or)两条件任何一个成立 |
! | 反向条件 |
12. 我们还可以用判断符号“ [ ]” (就是中括号) 来进行数据的判断:
# [ -z "$HOME" ] ; echo $?
中括号的使用方法与 test 几乎一模一样。只是中括号比较常用在条件判断式 if ..... then ..... fi 中。使用中括号必须要注意,因为中括号用在很多地方,包括通配符与正则表达式等等,所以如果要在 bash 的语法当中使用中括号作为 shell 的判断式,必须要注意中括号中的每个组件之间,组件与中括号之间要有空格符来分隔。在中括号内的变量,最好都以双引号括起来;常数,最好都以单或双引号括起来。
13. script 针对参数已经有设定好一些变量名称了,执行的脚本档名为 $0 ,第一个接的参数就是 $1, 依此类推。还有一些较为特殊的变量如下:
$# :代表后接的参数『个数』
$@ :代表『 "$1" "$2" "$3" "$4" 』之意,每个变量是独立的(用双引号括起来);
$* :代表『 "$1c$2c$3c$4" 』,其中 c 为分隔字符,默认为空格键
在script中可以使用"shift n" 将参数数组向左位移n位(前n个参数直接抛弃),默认n为1。
14. 如果你只有一个判断式要进行,语法如下:
if [ 条件 ]; then 当条件成立时,可以进行的指令工作内容; fi <==将 if 反过来写,结束 if 之意!
除了『将多个条件写入一个中括号内的情况』外, 还可以有多个中括号来隔开,而括号与括号之间,则以 && 或 || 来隔开。&&代表与,||代表或。例如:[ "$yn" == "Y" -o "$yn" == "y" ] 可以写成 [ "$yn" == "Y" ] || [ "$yn" == "y" ]。
15. 多重条件判断的语法如下:
if [ 条件 ]; then 当条件成立时,可以进行的指令工作内容; else 当条件不成立时,可以进行的指令工作内容; fi
复杂条件判断的语法如下:
if [ 条件一 ]; then 当条件一成立时,可以进行的指令工作内容; elif [ 条件二 ]; then 当条件一不成立但条件二成立时,可以进行的指令工作内容; else 当条件一与二均不成立时,可以进行的指令工作内容; fi
elif 也是个判断式,因此出现 elif 后面都要接 then ,但是 else 已经是最后的没有成立的结果了, 所以 else 后面没有 then。
16. date --date='YYYYMMDD' 可以以UDC时区显示指定日期。加上"+s%" 选项会显示自 1970-01-01 UDC累积而来的秒数。
17. case判断语法如下:
case $变量名称 in <==关键词为 case ,变量名前有钱字号 "第一个变量内容") <==每个变量内容建议用双引号括起来,关键字则为小括号 ) 程序段 ;; <==每个类别结尾使用两个连续的分号来处理! "第二个变量内容") 程序段 ;; *) <==最后一个变量内容都会用 * 来代表所有其他值 不包含第一个变量内容与第二个变量内容的其他程序执行段 ;; esac <==最终的 case 结尾,『反过来写』
18. 函数定义的语法如下:
function fname() { 程序段 }
fname为函数名或指令名,函数调用的形式就像指令执行一样,直接使用fname;即可由于 shell script 的执行方式是由上而下,由左而右的, 因此在 shell script 当中的 function 的定义一定要在程序的最前面, 这样才能够在执行时被找到。
19. echo 加上-n选项表示不断行,后面的命令继续在同一行显示。
20. function 也是拥有内建变量的,它的内建变量与 shell script 很类似, 函数名称代表示 $0 ,而后续接的变量也是以 $1, $2... 来表示的。因此『 function fname() { 程序段 } 』内的 $0, $1... 等等与 shell script 的 $0 是不同的。
21. 循环可以不断地执行某个程序段落,直到用户设定的条件达成为止。。除了依据条件达成与否的不定循环外, 还有另外一种已经固定要跑多少次的循环形态,可称为固定循环。不定循环的语法有以下两种:
while [ condition ] <==中括号内的状态就是判断式 do <==do 是循环的开始! 程序段落 done <==done 是循环的结束 until [ condition ] do 程序段落 done
while 循环的意思是『当 condition 条件成立时,就进行循环,直到 condition 的条件不成立才停止』。until 循环与 while 相反,是指『当 condition 条件成立时,就终止循环, 否则就持续进行循环的程序段。』
22. 固定循环的语法如下:
for var in con1 con2 con3 ... do 程序段 done
$var 的变量内容在循环工作时:第一次循环时, $var 的内容为 con1 ;2. 第二次循环时, $var 的内容为 con2 ;第三次循环时, $var 的内容为 con3 ...这里,con1...conN之间以空白键分隔。seq n1 nN可以生成从n1开始到nN的数列,并以换行分隔。以下script通过管道命令的 cut 捕捉出账号名称后,以 id 及 finger 分别检查使用者的标识符与特殊参数:
#!/bin/bash # Program # Use id, finger command to check system account's information. # History # 2009/02/18 VBird first release PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin:~/bin export PATH users=$(cut -d ':' -f1 /etc/passwd) # 提取账号名称 for username in $users # 开始循环进行! do id $username finger $username done
23. for 循环还有另外一种写法:
for (( 初始值; 限制值; 执行步阶 )) do 程序段 done
初始值为某个变量在循环当中的起始值,直接以类似 i=1 来设定;限制值:当变量的值在这个限制值的范围内,就继续进行循环。例如 i<=100;执行步阶:每做一次循环时,变量的变化量。例如 i=i+1 或 i++。
24. bash 支持以下相关参数:
# sh [-nvx] scripts.sh
-n 选项表示不要执行 script,仅检查语法的正确性; -v 选项表示在执行 sccript 前,先将 scripts 的内容输出到屏幕上;-x 选项会将执行到的 script 内容显示到屏幕上,这样就可以追踪程序执行的路径。
25. whoami指令可以显示你目前的login账号。
相关推荐
第十三章、学习 Shell Scripts最近更新日期:2009/02/18如果你真的很想要走信息这条路,并且想要好好的管理好属于你的主机,那么,别说鸟哥不告诉
第0章 计算机概论 第1章 Linux是什么 第2章 Linux 如何学习 第3章 主机规划与磁盘分区 第4章 安装Centos5.x 与多重引导小技巧 第5章 首次登入与在线求助(man page) ...第13章 学习Shell Scripts ........
第十三章学习 Shell Scripts1、shell script 程序化脚本这个程序是使用纯文本文件,将一些 shell 的语法和指令(含外部指令)写在里面
第十三章 线程(Threads)....................80 第十四章 标准I/O流与文件.............84 第十五章 网络编程.89 Tiger学习笔记..................94 第一章 Java5.0新特性.......................94 第二章 基础...
第十三章 线程(Threads)....................80 第十四章 标准I/O流与文件.............84 第十五章 网络编程.89 Tiger学习笔记..................94 第一章 Java5.0新特性.......................94 第二章 基础...
第三部分. 超越基本 9. 变量重游 9.1. 内部变量 9.2. 操作字符串 9.3. 参数替换 9.4. 指定类型的变量:declare或者typeset 9.5. 变量的间接引用 9.6. $RANDOM: 产生随机整数 9.7. 双圆括号结构 10. 循环...
第三部分. 超越基本 9. 变量重游 9.1. 内部变量 9.2. 操作字符串 9.3. 参数替换 9.4. 指定类型的变量:declare 或者typeset 9.5. 变量的间接引用 9.6. $RANDOM: 产生随机整数 9.7. 双圆括号结构 10. 循环和分支 10.1....
第 1 章命令行操作及常用命令使用...........................................................................................5 1.1 命令行操作 ................................................................
Hadoop definitive 第三版, 目录如下 1. Meet Hadoop . . . 1 Data! 1 Data Storage and Analysis 3 Comparison with Other Systems 4 RDBMS 4 Grid Computing 6 Volunteer Computing 8 A Brief History of Hadoop 9...
1.PPPoE用户认证+Radius或者利用内置的User Manage 功能管理用户,多种灵活的计费模式 2.HotSpot热点认证或叫Web认证,强制弹出认证页,跨平台,不依赖第三方软件或者操作系统,非常先进 3.非常先进,功能完善的...
13. azalea_perf1-dragonboard 14. astar_parrot-tina 15. astar_parrot-dragonboard 16. astar_spk-tina 17. astar_spk-dragonboard 18. azalea_evb-tina 19. azalea_evb-dragonboard Which would...