`
leonzhx
  • 浏览: 793354 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

第十三章 学习 Shell Scripts

阅读更多

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 捕捉出账号名称后,以 idfinger 分别检查使用者的标识符与特殊参数:

#!/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账号。

 

 

分享到:
评论

相关推荐

    鸟哥的 Linux 私房菜第13章-学习 Shell Scripts1

    第十三章、学习 Shell Scripts最近更新日期:2009/02/18如果你真的很想要走信息这条路,并且想要好好的管理好属于你的主机,那么,别说鸟哥不告诉

    Linux操作系统学习

    第0章 计算机概论 第1章 Linux是什么 第2章 Linux 如何学习 第3章 主机规划与磁盘分区 第4章 安装Centos5.x 与多重引导小技巧 第5章 首次登入与在线求助(man page) ...第13章 学习Shell Scripts ........

    13_学习_Shell_Scripts

    学习Shell Scripts的原因** 学习Shell脚本的原因主要在于以下几点: - **自动化日常任务**:通过编写脚本,你可以将重复性的任务集成到一个可执行文件中,减少手动操作,提高效率。 - **系统管理**:在Linux环境...

    android-shell-scripts:帮助与Android设备配合使用的Shell脚本

    9. **第三方应用管理**: - 除了官方市场的应用,一些脚本还可以处理非Play商店的APK安装和管理,这对于开发者测试未发布的版本或使用非市场应用很有用。 10. **兼容性**: - "android-shell-scripts"的脚本设计...

    Java/JavaEE 学习笔记

    第十三章 线程(Threads)....................80 第十四章 标准I/O流与文件.............84 第十五章 网络编程.89 Tiger学习笔记..................94 第一章 Java5.0新特性.......................94 第二章 基础...

    shell脚本练习题

    根据提供的文件内容,我们可以归纳出一系列与Shell脚本相关的知识点,包括如何编写基本的脚本来完成特定任务,例如处理文件、目录操作、条件判断、循环结构等。下面将逐一解析这些练习题涉及的关键知识点。 ### ...

    Linux13章1

    在本文中,我们将深入探讨第十三章中关于Shell Scripts的知识点。 首先,Shell Script是一种程序化脚本,它是使用特定的Shell语言(如bash、sh、ksh等)编写的。这些脚本可以包含各种Shell语法和指令,包括外部命令...

    J2EE学习笔记(J2ee初学者必备手册)

    第十三章 线程(Threads)....................80 第十四章 标准I/O流与文件.............84 第十五章 网络编程.89 Tiger学习笔记..................94 第一章 Java5.0新特性.......................94 第二章 基础...

    shell脚本练习题.docx

    在本资源中,我们可以看到文件操作的使用,例如在 practice 三中,使用 head 和 tail 命令读取 /etc/passwd 文件的第 2、4、6、10、13、15 行,并将其保存至 /tmp/mypasswd 文件中。 4. 数组的使用:数组是一种重要...

    常用得shell大全

    - 第三方应用软件安装目录。 12. **/proc** - 虚拟文件系统目录,包含运行中进程的信息。 - **`version`**:内核版本信息。 - **`sys/kernel`**:系统内核相关配置。 13. **/root** - 系统管理员的家目录。 14....

    linux系统学习笔记

    1. **Linux系统Shell类型**:Linux系统提供了多种Shell供用户选择,常见的包括Bourne shell (`sh`), C shell (`csh`), Korn shell (`ksh`)等。其中,`sh`是Unix系统中最常用的Shell,在大多数Linux发行版中作为默认...

    第2章 Linux的使用.rar

    通过学习和实践以上知识点,你将能够熟练地在Linux环境下工作,无论是日常办公还是进行系统运维,Linux都将为你提供强大的支持。记住,掌握Linux不仅仅是为了使用,更是为了理解操作系统底层的工作原理,提升自己的...

    bash-scripts:bash脚本的个人收藏

    Bash(Bourne-Again SHell)是GNU项目的一部分,是这些操作系统中的默认命令行解释器。它允许用户通过编写脚本来执行一系列命令,极大地提高了工作效率。"bash-scripts:bash脚本的个人收藏"这个标题暗示了这是一个...

    linux 授课计划

    本授课计划针对13计网1-3班的学生,旨在教授Linux操作系统及其应用,共计56学时,由任靖老师担任授课教师,课程在2014-2015学年的第一学期进行。 【教学内容】 1. **认识Linux操作系统** (2学时): 这部分将介绍...

    Linux学习笔记(强悍总结值得一看)

    13. **Alt + N**:切换到第N个标签(N为数字)。 #### 五、关机和重启命令 1. **shutdown**:用于关机或重启系统。 2. **reboot**:直接重启系统。 3. **halt**:停止系统运行。 4. **poweroff**:关闭系统电源。 ...

    Linux高级bash编程

    第三部分. 超越基本 9. 变量重游 9.1. 内部变量 9.2. 操作字符串 9.3. 参数替换 9.4. 指定类型的变量:declare或者typeset 9.5. 变量的间接引用 9.6. $RANDOM: 产生随机整数 9.7. 双圆括号结构 10. 循环...

    SQL注入语句

    11. **通过复制CMD创建UNICODE漏洞**:"exec master.dbo.xp_cmdshell 'copy c:\winnt\system32\cmd.exec:\inetpub\scripts\cmd.exe'" 通过复制CMD执行程序,可能利用UNICODE漏洞提升权限。 12. **遍历系统目录结构*...

    Advanced Bash-Scripting Guide <>

    第三部分. 超越基本 9. 变量重游 9.1. 内部变量 9.2. 操作字符串 9.3. 参数替换 9.4. 指定类型的变量:declare 或者typeset 9.5. 变量的间接引用 9.6. $RANDOM: 产生随机整数 9.7. 双圆括号结构 10. 循环和分支 10.1....

Global site tag (gtag.js) - Google Analytics