今天各种场合都有使用各种Linux发行版,从嵌入式设备到超级计算机,并且在服务器领域确定了地位,通常服务器使用LAMP(Linux + Apache + MySQL + PHP)或LNMP(Linux + Nginx+ MySQL + PHP)组合。
目前Linux不仅在家庭与企业中使用,并且在政府中也很受欢迎。 Linux系统启动过程 内核的引导、运行init、系统初始化、建立终端、用户登录系统 当计算机打开电源后,首先是BIOS开机自检,按照BIOS中设置的启动设备(通常是硬盘)来启动。 操作系统接管硬件以后,首先读入 /boot 目录下的内核文件init 进程是系统所有进程的起点,你可以把它比拟成系统所有进程的老祖宗,没有这个进程,系统中任何进程都不会启动。
init 程序首先是需要读取配置文件 /etc/inittab许多程序需要开机启动。它们在Windows叫做"服务"(service),在Linux就叫做"守护进程"(daemon)。
init进程的一大任务,就是去运行这些开机启动的程序。
但是,不同的场合需要启动不同的程序,比如用作服务器时,需要启动Apache,用作桌面就不需要。
Linux允许为不同的场合,分配不同的开机启动程序,这就叫做"运行级别"(runlevel)。也就是说,启动时根据"运行级别",确定要运行哪些程序。一般来说,用户的登录方式有三种:
(1)命令行登录 (2)ssh登录 (3)图形界面登录 Linux文件基本属性 Linux系统是一种典型的多用户系统,不同的用户处于不同的地位,拥有不同的权限。为了保护系统的安全性,Linux系统对不同的用户访问同一文件(包括目录文件)的权限做了不同的规定 在Linux中我们可以使用ll或者ls –l命令来显示一个文件的属性以及文件所属的用户和组 bin文件的第一个属性用"d"表示。"d"在Linux中代表该文件是一个目录文件 当为[ d ]则是目录 当为[ - ]则是文件; 若是[ l ]则表示为链接文档(link file); 若是[ b ]则表示为装置文件里面的可供储存的接口设备(可随机存取装置); 若是[ c ]则表示为装置文件里面的串行端口设备,例如键盘、鼠标(一次性读取装置)在Linux系统中,用户是按组分类的,一个用户属于一个或多个组。
文件所有者以外的用户又可以分为文件所有者的同组用户和其他用户。 因此,Linux系统按文件所有者、文件所有者同组用户和其他用户来规定了不同的文件访问权限 bin文件是一个目录文件,属主和属组都为root,属主有可读、可写、可执行的权限;与属主同组的其他用户有可读和可执行的权限;其他用户也有可读和可执行的权限 1、chgrp:更改文件属组 chgrp [- R ] 属组名文件名 -R:递归更改文件属组,就是在更改某个目录文件的属组时,如果加上-R的参数,那么该目录下的所有文件的属组都会更改 2、chown:更改文件属主,也可以同时更改文件属组 chown [– R ] 属主名 文件名 chown [- R ] 属主名:属组名 文件名 进入 /root 目录(~)将install.log的拥有者改为bin这个账号 [ root@www ~] cd ~ [ root@www ~]# chown bin install . log [ root@www ~]# ls - l - rw - r -- r -- 1 bin users 68495 Jun 25 08 : 53 install . log 将install.log的拥有者与群组改回为root: [ root@www ~]# chown root : root install . log [ root@www ~]# ls - l - rw - r -- r -- 1 root root 68495 Jun 25 08 : 53 install . log 3、chmod:更改文件9个属性 Linux文件与目录管理 Linux的目录结构为树状结构,最顶级的目录为根目录 / 其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们 几个常见的处理目录的命令 ls: 列出目录 cd:切换目录 pwd:显示目前的目录 mkdir:创建一个新的目录 rmdir:删除一个空的目录 cp: 复制文件或目录 rm: 移除文件或目录 可以使用 man [命令] 来查看各个命令的使用文档,如 :man cp 在Linux系统当中, ls 命令可能是最常被运行的 [ root@www ~]# ls [- aAdfFhilnrRSt ] 目录名称 [ root@www ~]# ls [-- color ={ never , auto , always }] 目录名称 [ root@www ~]# ls [-- full - time ] 目录名称选项与参数:
-a :全部的文件,连同隐藏档( 开头为 . 的文件) 一起列出来(常用) -d :仅列出目录本身,而不是列出目录内的文件数据(常用) -l :长数据串列出,包含文件的属性与权限等等数据;(常用)将家目录下的所有文件列出来(含属性与隐藏档)
[ root@www ~]# ls - al ~ cd是Change Directory的缩写,这是用来变换工作目录的命令 cd [相对路径或绝对路径] #使用 mkdir 命令创建w3cschool.cc目录 [ root@www ~]# mkdir w3cschool . cc #使用绝对路径切换到w3cschool.cc目录 [ root@www ~]# cd / root / w3cschool . cc / #使用相对路径切换到w3cschool.cc目录 [ root@www ~]# cd ./ w3cschool . cc / # 表示回到自己的家目录,亦即是 /root 这个目录 [ root@www w3cschool . cc ]# cd ~ # 表示去到目前的上一级目录,亦即是 /root 的上一级目录的意思; [ root@www ~]# cd .. pwd是Print Working Directory的缩写,也就是显示目前所在目录的命令 [ root@www ~]# pwd [- P ] 选项与参数: - P :显示出确实的路径,而非使用连结 ( link ) 路径。 范例:单纯显示出目前的工作目录: [ root@www ~]# pwd / root <== 显示出目录啦~ 范例:显示出实际的工作目录,而非连结档本身的目录名而已 [ root@www ~]# cd / var / mail <==注意,/ var / mail 是一个连结档 [ root@www mail ]# pwd / var / mail <==列出目前的工作目录 [ root@www mail ]# pwd - P / var / spool / mail <==怎么回事?有没有加 - P 差很多~ [ root@www mail ]# ls - ld / var / mail lrwxrwxrwx 1 root root 10 Sep 4 17 : 54 / var / mail -> spool / mail # 看到这里应该知道为啥了吧?因为 /var/mail 是连结档,连结到 /var/spool/mail # 所以,加上 pwd -P 的选项后,会不以连结档的数据显示,而是显示正确的完整路径啊! 如果想要创建新的目录的话,那么就使用mkdir (make directory) mkdir [- mp ] 目录名称选项与参数:
-m :配置文件的权限喔!直接配置,不需要看默认权限 (umask) 的脸色~ -p :帮助你直接将所需要的目录(包含上一级目录)递回创建起来! [ root@www ~]# cd / tmp [ root@www tmp ]# mkdir test <==创建一名为 test 的新目录 [ root@www tmp ]# mkdir test1 / test2 / test3 / test4 mkdir : cannot create directory `test1/test2/test3/test4': No such file or directory <== 没办法直接创建此目录啊! [root@www tmp]# mkdir -p test1/test2/test3/test4 加了这个 -p 的选项,可以自行帮你创建多层目录! 创建权限为rwx--x--x的目录 [ root@www tmp ]# mkdir - m 711 test2 [ root@www tmp ]# ls - l drwxr - xr - x 3 root root 4096 Jul 18 12 : 50 test drwxr - xr - x 3 root root 4096 Jul 18 12 : 53 test1 drwx -- x -- x 2 root root 4096 Jul 18 12 : 54 test2如果没有加上 -m 来强制配置属性,系统会使用默认属性。
如果我们使用 -m ,如上例我们给予 -m 711 来给予新的目录 drwx--x--x 的权限 删除空的目录 rmdir rmdir [- p ] 目录名称选项与参数:
-p :连同上一级『空的』目录也一起删除删除 w3cschool.cc 目录
[ root@www tmp ]# rmdir w3cschool . cc / [ root@www tmp ]# ls - l <==看看有多少目录存在? drwxr - xr - x 3 root root 4096 Jul 18 12 : 50 test drwxr - xr - x 3 root root 4096 Jul 18 12 : 53 test1 drwx -- x -- x 2 root root 4096 Jul 18 12 : 54 test2 [ root@www tmp ]# rmdir test <==可直接删除掉,没问题 [ root@www tmp ]# rmdir test1 <==因为尚有内容,所以无法删除! rmdir : `test1': Directory not empty [root@www tmp]# rmdir -p test1/test2/test3/test4 [root@www tmp]# ls -l <==您看看,底下的输出中test与test1不见了! drwx--x--x 2 root root 4096 Jul 18 12:54 test2利用 -p 这个选项,立刻就可以将 test1/test2/test3/test4 一次删除。
rmdir 仅能删除空的目录,你可以使用 rm 命令来删除非空目录 cp 即拷贝文件和目录 [ root@www ~]# cp [- adfilprsu ] 来源档( source ) 目标档( destination ) [ root@www ~]# cp [ options ] source1 source2 source3 .... directory选项与参数:
-a:相当於 -pdr 的意思,至於 pdr 请参考下列说明;(常用)
-d:若来源档为连结档的属性(link file),则复制连结档属性而非文件本身;
-f:为强制(force)的意思,若目标文件已经存在且无法开启,则移除后再尝试一次;
-i:若目标档(destination)已经存在时,在覆盖时会先询问动作的进行(常用)
-l:进行硬式连结(hard link)的连结档创建,而非复制文件本身;
-p:连同文件的属性一起复制过去,而非使用默认属性(备份常用);
-r:递回持续复制,用於目录的复制行为;(常用)
-s:复制成为符号连结档 (symbolic link),亦即『捷径』文件;
-u:若 destination 比 source 旧才升级 destination ! 用 root 身份,将 root 目录下的 .bashrc 复制到 /tmp 下,并命名为 bashrc [ root@www ~]# cp ~ /.bashrc / tmp / bashrc [ root@www ~]# cp - i ~ /.bashrc / tmp / bashrc cp : overwrite `/tmp/bashrc'? n <==n不覆盖,y为覆盖 移除文件或目录 rm rm [- fir ] 文件或目录 -f :就是 force 的意思,忽略不存在的文件,不会出现警告信息; -i :互动模式,在删除前会询问使用者是否动作 -r :递回删除啊!最常用在目录的删除了!这是非常危险的选项!!! [ root@www tmp ]# rm - i bashrc rm : remove regular file `bashrc'? y 移动文件与目录,或修改名称 mv选项与参数:
-f :force 强制的意思,如果目标文件已经存在,不会询问而直接覆盖; -i :若目标文件 (destination) 已经存在时,就会询问是否覆盖! -u :若目标文件已经存在,且 source 比较新,才会升级 (update) 复制一文件,创建一目录,将文件移动到目录中 [ root@www ~]# cd / tmp [ root@www tmp ]# cp ~/. bashrc bashrc [ root@www tmp ]# mkdir mvtest [ root@www tmp ]# mv bashrc mvtest将刚刚的目录名称更名为 mvtest2
[ root@www tmp ]# mv mvtest mvtest2 Linux文件内容查看 cat 由第一行开始显示文件内容 tac 从最后一行开始显示,可以看出 tac 是 cat 的倒著写! nl 显示的时候,顺道输出行号! more 一页一页的显示文件内容 less 与 more 类似,但是比 more 更好的是,他可以往前翻页! head 只看头几行 tail 只看尾巴几行 你可以使用 man [命令]来查看各个命令的使用文档,如 :man cp cat 由第一行开始显示文件内容 cat [- AbEnTv ]选项与参数:
-A :相当於 -vET 的整合选项,可列出一些特殊字符而不是空白而已; -b :列出行号,仅针对非空白行做行号显示,空白行不标行号! -E :将结尾的断行字节 $ 显示出来; -n :列印出行号,连同空白行也会有行号,与 -b 的选项不同; -T :将 [tab] 按键以 ^I 显示出来; -v :列出一些看不出来的特殊字符 检看 /etc/issue 这个文件的内容 [ root@www ~]# cat / etc / issue CentOS release 6.4 ( Final ) Kernel \r on an \m Linux用户和用户组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪,并控制他们对系统资源的访问;另一方面也可以帮助用户组织文件,并为用户提供安全性保护 每个用户账号都拥有一个惟一的用户名和各自的口令; 用户在登录时键入正确的用户名和口令后,就能够进入系统和自己的主目录实现用户账号的管理,要完成的工作主要有如下几个方面:
用户账号的添加、删除与修改。 用户口令的管理。 用户组的管理用户账号的管理工作主要涉及到用户账号的添加、修改和删除。
添加用户账号就是在系统中创建一个新账号,然后为新账号分配用户号、用户组、主目录和登录Shell等资源。刚添加的账号是被锁定的,无法使用 添加新用户 useradd 选项 用户名 添加用户批 添加和删除用户对每位Linux系统管理员都是轻而易举的事,比较棘手的是如果要添加几十个、上百个甚至上千个用户时,我们不太可能还使用useradd一个一个地添加,必然要找一种简便的创建大量用户的方法。Linux系统提供了创建大量用户的工具,可以让您立即创建大量用户 1、编辑一个文本用户文件每一列按照/etc/passwd密码文件的格式书写,要注意每个用户的用户名、UID、宿主目录都不可以相同,其中密码栏可以留做空白或输入x号。一个范例文件user.txt内容如下:
user001 :: 600 : 100 : user : /home/ user001 : /bin/ bash user002 :: 601 : 100 : user : /home/ user002 : /bin/ bash user003 :: 602 : 100 : user : /home/ user003 : /bin/ bash user004 :: 603 : 100 : user : /home/ user004 : /bin/ bash user005 :: 604 : 100 : user : /home/ user005 : /bin/ bash user006 :: 605 : 100 : user : /home/ user006 : /bin/ bash 2、以root身份执行命令 /usr/sbin/newusers,从刚创建的用户文件user.txt中导入数据,创建用户 # newusers < user.txt 然后可以执行命令 vipw 或 vi /etc/passwd 检查 /etc/passwd 文件是否已经出现这些用户的数据,并且用户的宿主目录是否已经创建 3、执行命令/usr/sbin/pwunconv将 /etc/shadow 产生的 shadow 密码解码,然后回写到 /etc/passwd 中,并将/etc/shadow的shadow密码栏删掉。这是为了方便下一步的密码转换工作,即先取消 shadow password 功能。
# pwunconv 4、 编辑每个用户的密码对照文件 user001 :密码 user002 :密码 user003 :密码 user004 :密码 user005 :密码 user006 :密码 5、 以root身份执行命令 /usr/sbin/chpasswd创建用户密码,chpasswd 会将经过 /usr/bin/passwd 命令编码过的密码写入 /etc/passwd 的密码栏。
# chpasswd < passwd.txt 6、 确定密码经编码写入/etc/passwd的密码栏后执行命令 /usr/sbin/pwconv 将密码编码为 shadow password,并将结果写入 /etc/shadow。
# pwconv 这样就完成了大量用户的创建了,之后您可以到/home下检查这些用户宿主目录的权限设置是否都正确,并登录验证用户密码是否正确 Linux磁盘管理Linux磁盘管理好坏管理直接关系到整个系统的性能问题。
Linux磁盘管理常用三个命令为df、du和fdisk。
df:列出文件系统的整体磁盘使用量 du:检查磁盘空间使用量 fdisk:用于磁盘分区 df 命令参数功能:检查文件系统的磁盘空间占用情况。可以利用该命令来获取硬盘被占用了多少空间,目前还剩下多少空间等信息 df [-ahikHTm] [目录或文件名]选项与参数:
-a :列出所有的文件系统,包括系统特有的 /proc 等文件系统; -k :以 KBytes 的容量显示各文件系统; -m :以 MBytes 的容量显示各文件系统; -h :以人们较易阅读的 GBytes, MBytes, KBytes 等格式自行显示; -H :以 M=1000K 取代 M=1024K 的进位方式; -T :显示文件系统类型, 连同该 partition 的 filesystem 名称 (例如 ext3) 也列出; -i :不用硬盘容量,而以 inode 的数量来显示将系统内所有的文件系统列出来!
[ root@www ~]# df Filesystem 1K - blocks Used Available Use % Mounted on / dev / hdc2 9920624 3823112 5585444 41 % / /dev/ hdc3 4956316 141376 4559108 4 % / home / dev / hdc1 101086 11126 84741 12 % / boot tmpfs 371332 0 371332 0 % /dev/ shm 在 Linux 底下如果 df 没有加任何选项,那么默认会将系统内所有的 (不含特殊内存内的文件系统与 swap) 都以 1 Kbytes 的容量来列出来将容量结果以易读的容量格式显示出来
[ root@www ~]# df - h Filesystem Size Used Avail Use % Mounted on / dev / hdc2 9.5G 3.7G 5.4G 41 % / /dev/ hdc3 4.8G 139M 4.4G 4 % / home / dev / hdc1 99M 11M 83M 12 % / boot tmpfs 363M 0 363M 0 % /dev/ shm du Linux du命令也是查看使用空间的,但是与df命令不同的是Linux du命令是对文件和目录磁盘使用的空间的查看,还是和df命令有一些区别的,这里介绍Linux du命令 du [-ahskm] 文件或目录名称选项与参数:
-a :列出所有的文件与目录容量,因为默认仅统计目录底下的文件量而已。 -h :以人们较易读的容量格式 (G/M) 显示; -s :列出总量而已,而不列出每个各别的目录占用容量; -S :不包括子目录下的总计,与 -s 有点差别。 -k :以 KBytes 列出容量显示; -m :以 MBytes 列出容量显示; fdisk是 Linux 的磁盘分区表操作工具 fdisk [- l ] 装置名称 磁盘格式化磁盘分割完毕后自然就是要进行文件系统的格式化,格式化的命令非常的简单,使用 mkfs(make filesystem) 命令。
语法:
mkfs [- t 文件系统格式] 装置文件名 磁盘检验fsck(file system check)用来检查和维护不一致的文件系统。
若系统掉电或磁盘发生问题,可利用fsck命令对文件系统进行检查。
语法:
fsck [- t 文件系统] [- ACay ] 装置名称 磁盘挂载与卸除Linux 的磁盘挂载使用 mount 命令,卸载使用 umount 命令。
磁盘挂载语法:
mount [- t 文件系统] [- L Label 名] [- o 额外选项] [- n ] 装置文件名 挂载点 Shell教程Shell 是一个用C语言编写的程序,它是用户使用Linux的桥梁。Shell既是一种命令语言,又是一种程序设计语言。
Shell 是指一种应用程序,这个应用程序提供了一个界面,用户通过这个界面访问操作系统内核的服务。
Ken Thompson的sh是第一种Unix Shell,Windows Explorer是一个典型的图形界面Shell Shell脚本Shell 脚本(shell script),是一种为shell编写的脚本程序。
业界所说的shell通常都是指shell脚本,但读者朋友要知道,shell和shell script是两个不同的概念。
由于习惯的原因,简洁起见,本文出现的"shell编程"都是指shell脚本编程,不是指开发shell自身 Shell环境 Shell 编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了Linux的Shell种类众多,常见的有:
Bourne Shell(/usr/bin/sh或/bin/sh) Bourne Again Shell(/bin/bash) C Shell(/usr/bin/csh) K Shell(/usr/bin/ksh) Shell for Root(/sbin/sh) ……本教程关注的是 Bash,也就是 Bourne Again Shell,由于易用和免费,Bash在日常工作中被广泛使用。同时,Bash也是大多数Linux系统默认的Shell。
在一般情况下,人们并不区分 Bourne Shell 和 Bourne Again Shell,所以,像 #!/bin/sh,它同样也可以改为#!/bin/bash。
#!告诉系统其后路径所指定的程序即是解释此脚本文件的Shell程序 "#!" 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种Shell echo命令用于向窗口输出文本 运行shell脚本有两种方式 1、作为可执行程序 chmod + x ./ test . sh #使脚本具有执行权限 ./ test . sh #执行脚本 一定要写成./test.sh,而不是test.sh,运行其它二进制的程序也一样,直接写test.sh,linux系统会去PATH里寻找有没有叫test.sh的,而只有/bin, /sbin, /usr/bin,/usr/sbin等在PATH里,你的当前目录通常不在PATH里,所以写成test.sh是会找不到命令的,要用./test.sh告诉系统说,就在当前目录找 2、作为解释器参数这种运行方式是,直接运行解释器,其参数就是shell脚本的文件名,如:
/bin/sh test.sh /bin/php test.php 这种方式运行的脚本,不需要在第一行指定解释器信息,写了也没用 Shell变量 定义变量:your_name="runoob.com" 变量名和等号之间不能有空格 变量名的命名需要遵循以下规则: 首个字符必须为字母(a-z,A-Z)。 中间不能有空格,可以使用下划线(_)。 不能使用标点符号。 不能使用bash里的关键字(可用help命令查看保留关键字)。 用语句给变量赋值 for file in 'ls/etc' 以上语句将/ect下目录的文件名循环出来 使用变量:使用一个定义过的变量,只要在变量名前面加美元符号即可 your_name="lin" echo $your_name echo ${your_name} 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界 推荐给所有变量加上花括号,这是个好的编程习惯 变量可以重新被定义 只读变量: 使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变 readonly myUrl 删除变量: unset variable_name 变量被删除后不能再次使用。unset 命令不能删除只读变量 变量类型:运行shell时,会同时存在三种变量:
1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行 Shell字符串 字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似单引号字符串的限制:
单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的; 单引号字串中不能出现单引号(对单引号使用转义符后也不行)。双引号的优点:
双引号里可以有变量 双引号里可以出现转义字符 获取字符串长度 string = "abcd" echo $ {# string } #输出 4 Shell数组bash支持一维数组(不支持多维数组),并且没有限定数组的大小。
类似与C语言,数组元素的下标由0开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于0在Shell中,用括号来表示数组,数组元素用"空格"符号分割开。定义数组的一般形式为:
数组名=(值 1 值 2 ... 值 n )读取数组元素值的一般格式是:
${数组名[下标]}使用@符号可以获取数组中的所有元素,例如:
echo $ { array_name [@]}获取数组长度的方法与获取字符串长度的方法相同,例如:
# 取得数组元素的个数 length = $ {# array_name [@]} # 或者 length = $ {# array_name [*]} # 取得数组单个元素的长度 lengthn = $ {# array_name [ n ]} 以"#"开头的行就是注释,会被解释器忽略。 sh里没有多行注释,只能每一行加一个#号 如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢? 每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果 Shell传递参数 可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为: $n 。 n 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推……$* 与 $@ 区别:
相同点:都是引用所有参数。 不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 "1 2 3"(传递了一个参数),而 "@" 等价于 "1" "2" "3"(传递了三个参数) Shell test 命令 Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试 num1 = 100 num2 = 100 if test $ [ num1 ] - eq $ [ num2 ] then echo '两个数相等!' else echo '两个数不相等!' fi cd / bin if test - e ./ bash then echo '文件已存在!' else echo '文件不存在!' fi Shell还提供了与( -a )、或( -o )、非( ! )三个逻辑操作符用于将测试条件连接起来,其优先级为:"!"最高,"-a"次之,"-o"最低 cd / bin if test - e ./ notFile - o - e ./ bash then echo '有一个文件存在!' else echo '两个文件都不存在' fi 在sh/bash里,如果else分支没有语句执行,就不要写这个else if condition then command1 command2 ... commandN else command fi if condition1 then command1 elif condition2 then command2 else commandN fi for循环 for var in item1 item2 ... itemN do command1 command2 ... commandN done for loop in 1 2 3 4 5 do echo "The value is: $loop" done #!/bin/sh int = 1 while (( $int <= 5 )) do echo $int let "int++" done 使用了 Bash let 命令,它用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。
echo '按下 <CTRL-D> 退出' echo - n '输入你最喜欢的电影名: ' while read FILM do echo "是的!$FILM 是一部好电影" done无限循环语法格式:
while :do command done或者
while true do command done Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令 echo '输入 1 到 4 之间的数字:' echo '你输入的数字为:' read aNum case $aNum in 1 ) echo '你选择了 1' ;; 2 ) echo '你选择了 2' ;; 3 ) echo '你选择了 3' ;; 4 ) echo '你选择了 4' ;; *) echo '你没有输入 1 到 4 之间的数字' ;; esac重定向一般通过在命令间插入特定的符号来实现。特别的,这些符号的语法如下所示:
command1 > file1 上面这个命令执行command1然后将输出的内容存入file1。 注意任何file1内的已经存在的内容将被新内容替代。如果要将新内容添加在文件末尾,请使用>>操作符 #! /bin/sh 是 指此脚本使 用,/bin/sh来 解释执行 , #!是特殊的表示符,其后面根的是此解释此脚本的shell的路径 DIRNAME指令 功能:从给定的包含绝对路径的文件名中去除文件名(非目录的部分),然后返回剩下的路径(目录的部分)