I.はじめに
1.シェルとは何ですか
シェルコマンドタイマーで、彼は、ユーザーとの直接対話を担当するオペレーティングシステムの最外層に、ユーザは、説明のOSを入力し、オペレーティングシステムの出力のすべての種類に対処するために持っている必要がありました、私は、ユーザーを返す画面に出力し、そのよう対話が対話的にすることができます(キーボードコマンドは、すぐに応答シェルを取得することができます)、または非対話型(スクリプトの実行が)方法でした
次のように示します:
2.シェルスクリプトとは何ですか
実際には、プログラムは、プログラムファイルの実装により、あなたがコマンドとステートメントは、これらのコマンド、一連の変数をすることによって、そのような連結フォームは、強力なシェルスクリプトは、バッチファイルは、同様のDOSのバッチシステム持った有機などの制御文を流れることができます。例としては、次のとおりです:(バックアップサイトデータベーススクリプト)
オフ@echo 設定日付 =%の日付:〜0、4% - %の日付 ::〜5、2% - %の日付:〜8、2%の mysqldumpを -uroot -poldboy -A-B> D:\ BAK \ " %日付%の.sql " rar.exe A -k -r -s -ml D:\ BAK \ " %日付%" .sql.rarのD:\ BAK \ " %日付%」の.sql デルD:\ BAK \ * .SQL rar.exe A -k -r -s -ml D:\ BAK \ " %日付%" htdocs.rar D:\作業\ PHPnow \ htdocsに
図3に示すように、職場でのシェル位置
4、shell的种类
shell 脚本语言是弱类型语言,较为通用shell 有标准的Bourne shell (sh)和C shell(csh),其中Bourne shell(sh)已经被bash shell 取代
bourne shell(sh,ksh,an bash)
bourene shell(sh)
bourne again shell (bash)
POSIX shell (sh)
c shell
c shell (csh)
TENEX/TOPS C shell (tcsh)
查看系统得shell
[root@web1 ~]# cat /etc/shells /bin/sh /bin/bash /sbin/nologin /usr/bin/sh /usr/bin/bash /usr/sbin/nologin /bin/tcsh /bin/csh
用的最多得莫属bash了,bash是bourne again shell的缩写,bash是 bourne shell(sh)发展来的,但又不完全相同,它包含了csh和ksh的特色,但大多数脚本都可以不加修改的在bash上运行,是bourne shell的扩展,增加了一些特性,命令补全,命令编辑和命令历史等
5、其他常用脚本语言种类
php
perl
python
js
6、第一个shell脚本
#!/bin/bash echo "Hello World !" [root@web1 bash-test]# chmod +x 1.sh #添加运行权限 [root@web1 bash-test]# 1.sh #这样运行不了,因为运行其它二进制的程序也一样,直接写 1.sh,linux 系统会去 PATH 里寻找有没有叫 1.sh 的,而只有 /bin, /sbin, /usr/bin,/usr/sbin 等在 PATH 里,你的当前目录通常不在 PATH 里,所以写成 1.sh 是会找不到命令的,要用 ./test.sh 告诉系统说,就在当前目录找。 [root@web1 bash-test]# ./1.sh hello world! [root@web1 bash-test]# bash 1.sh #这是另一种方式,指定解释器直接运行 hello world! [root@web1 bash-test]#
二、shell文件测试表达式
1、文件测试表达式用法
在处理一个对象的时候,需要对对象进行测试,只有符合要求,采取操作处理,这样做就可以避免程序出错及无畏的消耗,这个要测试的对象可以是文件,字符串,数字。
2、文件测试操作符号
3、文件测试表达式举例
1)普通文件
[root@www ~]# touch abc [root@www ~]# ll abc -rw-r--r-- 1 root root 0 Jan 22 20:43 abc [root@www ~]# [ -f abc ]&&echo 1||echo 0 #如果存在echo 1 ,否则echo 0 1 [root@www ~]#
2)目录文件
[root@www ~]# mkdir dir [root@www ~]# ll dir total 0 [root@www ~]# [ -f dir ]&&echo 1||echo 0 0 [root@www ~]# [ -e dir ]&&echo 1||echo 0 #只要存在就为真 1 [root@www ~]# [ -d dir ]&&echo 1||echo 0 1 [root@www ~]#
3)文件属性
[root@www ~]# [ -r abc ]&&echo 1||echo 0 1 [root@www ~]# [ -w abc ]&&echo 1||echo 0 1 [root@www ~]# [ -x abc ]&&echo 1||echo 0 0 [root@www ~]# chmod 000 abc #root 用户不起作用,还是可读,可写 [root@www ~]# [ -r abc ]&&echo 1||echo 0 1 [root@www ~]# [ -w abc ]&&echo 1||echo 0 1 [root@www ~]# [ -x abc ]&&echo 1||echo 0 0 [root@www ~]# ll abc ---------- 1 root root 0 Jan 22 20:43 abc #############切换用户测试##################### [root@www ~]# useradd abc [root@www ~]# cd /tmp [root@www tmp]# touch abc [root@www ~]# su abc [abc@www /]$ cd /tmp [abc@www tmp]$ [ -r abc ]&&echo 1||echo 0 0 [abc@www tmp]$ [ -d abc ]&&echo 1||echo 0 0 [abc@www tmp]$ [ -w abc ]&&echo 1||echo 0 0 [abc@www tmp]$ ll abc ---------- 1 root root 0 Jan 22 20:57 abc 文件的读写执行等属性,不光是根据文件属性,而是当前执行脚本的用户根据测试选项是否真的可操作
4)测试shell变量例子
[root@www ~]#file1=/etc/services [root@www ~]#file2=/etc/rc.local [root@www ~]# echo $file1 /etc/services [root@www ~]# echo $file2 /etc/rc.local
5)对单个文件变量测试,也可以测试实体文件路径
[root@www ~]# [ -f "$file1" ]&& echo 1 || echo 0 1 [root@www ~]# [ -d "$file1" ]&& echo 1 || echo 0 0 [root@www ~]# [ -s "$file1" ]&& echo 1 || echo 0 1 [root@www ~]# [ -e "$file1" ]&& echo 1 || echo 0 1
6)对单个目录变量测试
7)可以看看centos6的rpcbind启动脚本启用很多测试语法
8)对比if,比判断语句简单
三、字符串测试表达式
1、字符串测试表达式参数
字符串需要用""引起来
比较符号两段必须要空格
2、字符串测试表达式举例
1)测试1
[root@www ~]# [ -z "012" ] && echo 1 || echo 0 #不为0 ,为假,所以echo 0 0 [root@www ~]# [ -z "" ] && echo 1 || echo 0 #为0,为真,所以echo 1 1 [root@www ~]# [ -n "" ] && echo 1 || echo 0 #为0,所以为假,所以echo 0 0 [root@www ~]#
2)测试2
[root@www ~]# test1=abc [root@www ~]# [ "test1" = "abc" ] &&echo 1||echo 0 #不等于为真,所以 echo 0 0 [root@www ~]# [ "$test1" = "abc" ] &&echo 1||echo 0 #等于为真,所以echo 1 1 [root@www ~]# [ "$test1" != "abc" ] &&echo 1||echo 0 #不等于为真,所以 echo 0 0 [root@www ~]#
3)“=”号两段不加空格测试,不加引号也容易出问题
[root@www ~]# [ "abc"="1" ] &&echo 1||echo 0 1 [root@www ~]# [ "abc" = "1" ] &&echo 1||echo 0 0
4)可以参考centos7 上 /etc/rc.d/init.d/functions这个文件
三、整数二元比较操作符
1、整数二元比较操作符参数
2、整数二元比较操作符举例
1)测试1
[root@www ~]# [ 2 > 1 ]&&echo 1||echo 0 1 [root@www ~]# [ 2 < 1 ]&&echo 1||echo 0 #2不小于1,这个结果时错的,因为没有转义 1 [root@www ~]# [ 2\ < 1 ]&&echo 1||echo 0 1 [root@www ~]# [ 2 \< 1 ]&&echo 1||echo 0 0 [root@www ~]#
2)测试2,( [] 里面用字母的形式,[[]] 用符号的形式)
[root@www ~]# [[ 2 < 1 ]]&&echo 1||echo 0 0 [root@www ~]# [ 2 -lt 1 ]&&echo 1||echo 0 0 [root@www ~]# [ 2 -le 1 ]&&echo 1||echo 0 0 [root@www ~]# [ 2 -gt 1 ]&&echo 1||echo 0 1 [root@www ~]# [ 2 -ge 1 ]&&echo 1||echo 0 1 [root@www ~]#
3)测试总结
1、整数加双引号也是对的
2、[[]]用-eq等写法也是对的,[[]]用>等写法也可能不对(只比较第一位,逻辑结果不对)
3、[]用>号的写法没错,但逻辑结果不对
4)系统脚本例子
[root@xen-node1 ~]# grep -w "\-eq" /etc/init.d/nfs [ $RETVAL -eq 0 ] && RETVAL=$rval [ $RETVAL -eq 0 ] && RETVAL=$rval [ $RETVAL -eq 0 ] && RETVAL=$rval [ $RETVAL -eq 0 ] && RETVAL=$rval [ $RETVAL -eq 0 ] && RETVAL=$rval [root@xen-node1 ~]#
四、逻辑操作符号
1、逻辑操作符号参数
2、注意
!中文意思是反:与一个逻辑值相反的逻辑值
-a中文意思是与(and&&):两个逻辑值都为真,返回值才为真,反正为假
-o中文意思是或(or||):两个逻辑值只要有一个为真,返回值就为真
3、逻辑操作符运算规则
结论:-a和&&的运算规则:只有两段都是1才为真
真 true 1 假 false 0 ------------------------ and 1*0=0 假 and 0*1=0 假 and 1*1=1 真 and 0*0=0 假 只有两段都是1才为真,and交际 结论:-o或||两端都是0才为假,任何一端不为0都是真 --------------------------- or 1+0=1 真 or 1+2=2 真 or 0+1=1 真 or 0+0=0 假 两端都是0才为假,不为0都是真 或并集
4、逻辑操作符示例
1)测试1
[root@www ~]# f1=/etc/rc.local ; f2=/etc/services [root@www ~]# [ -f "$f1" -a -f "$f2"]&& echo 1||echo 0 #括号里面没加空格 -bash: [: missing `]' 0 [root@www ~]# [ -f "$f1" -a -f "$f2" ]&& echo 1||echo 0 #为真 1 [root@www ~]# [[ -f "$f1" && -f "$f2" ]]&& echo 1||echo 0 #用&&需要加双括号 1 [root@www ~]# [ -f "$f1" && -f "$f2" ]&& echo 1||echo 0 #不加双括号报错 -bash: [: missing `]' 0 [root@www ~]# [ -f "$f1" ] && [ -f "$f2" ]&& echo 1||echo 0 #这样也可以 1 [root@www ~]#
2)测试2
[root@xen-node1 ~]# sed -n '87,90p' /etc/init.d/nfs [ "$NFSD_MODULE" != "noload" -a -x /sbin/modprobe ] && { /sbin/modprobe nfsd [ -n "$RDMA_PORT" ] && /sbin/modprobe svcrdma } You have new mail in /var/spool/mail/root [root@xen-node1 ~]#
3)总结
[]中用-a,-o,! [[]]中用&&,||,! test用法和[]相同 多个[]之间以及多个[[]]之间,或者任意混合中间逻辑操作符都是&&或||