因为博客园中dollar符号有别的意义,因此文中的dollar符号使用¥表示java
[root@localhost script]# cat -n sh01.sh 1 #!/bin/bash 2 #Program: 3 #This program shows "Hello World!" in your screen. 4 PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin 5 export PATH; 6 echo -e "Hello World! \a \n" 7 exit 0
第一行:#!/bin/bash 声明这个script使用的shell名称node
第二三行:注释shell
第四行:环境变量的声明,这样程序执行时能够直接执行一些外部命令,而没必要写绝对路径bash
第五行:使环境变量生效less
第六行:主程序部分oop
第七行:使用exit命令让程序中断,而且传回一个数值给系统,执行完该script后,使用echo ¥?能够获得该值。测试
[root@localhost script]# vi sh01.sh [root@localhost script]# ./sh01.sh Hello World! //查看上面script返回给系统的值 [root@localhost script]# echo ¥? 0
[root@localhost script]# cat -n sh02.sh 1 #!/bin/bash 2 PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin 3 export PATH 4 5 read -p "please input your first name:" firstname #tell user to input their name 6 read -p "please input your last name:" lastname 7 echo -e "\n Your full name is:$firstname $lastname" [root@localhost script]# sh sh02.sh please input your first name:wu please input your last name:chao Your full name is:wu chao [root@localhost script]#
//查看script脚本 [root@localhost script]# cat sh03.sh #!/bin/bash PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin export PATH echo -e "I will use 'touch' command to create 3 files." read -p "please input your file name:" fileuser filename=¥{fileuser:-"filename"} date1=¥(date -d -2day +%Y%m%d) date2=¥(date -d -1day +%Y%m%d) date3=¥(date +%Y%m%d) file1=¥{filename}¥{date1} file2=¥{filename}¥{date2} file3=¥{filename}¥{date3} touch "¥file1" touch "¥file2" touch "¥file3" //执行该脚本 [root@localhost script]# sh sh03.sh I will use 'touch' command to create 3 files. please input your file name:testFile [root@localhost script]# //查看结果 [root@localhost script]# ls -l testFile* -rw-r--r--. 1 root root 0 7月 19 12:40 testFile20160717 -rw-r--r--. 1 root root 0 7月 19 12:40 testFile20160718 -rw-r--r--. 1 root root 0 7月 19 12:40 testFile20160719 [root@localhost script]#
注:¥()是执行里面的代码获得的结果。¥{}取变量的值。ui
[root@localhost script]# cat sh04.sh #!/bin/bash PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin export PATH echo -e "please input two numbers:" read -p "first number:" n1 read -p "second number:" n2 total=¥((¥n1*¥n2)) echo -e "\n The result of ¥n1 * ¥n2 is ==> ¥total" [root@localhost script]# [root@localhost script]# sh sh04.sh please input two numbers: first number:12 second number:23 The result of 12 * 23 is ==> 276 [root@localhost script]#
用于计算spa
[root@localhost script]# echo ¥((23*3)) 69
好比使用“sh sh01.sh”来执行脚本时,该脚本会使用一个新的bash环境(子进程)。即脚本实在子进程的bash环境执行的,当执行完后,子进程的变量不会传给父进程。调试
//查看script脚本中定义了firstname变量 [root@localhost script]# cat sh02.sh #!/bin/bash PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin export PATH read -p "please input your first name:" firstname #tell user to input their name read -p "please input your last name:" lastname echo -e "\n Your full name is:$firstname $lastname" //直接执行该脚本 [root@localhost script]# sh sh02.sh please input your first name:wu please input your last name:chao Your full name is:wu chao //执行完上面的脚本后,在父进程尝试获取该变量,发现获取不到 [root@localhost script]# echo ¥firstname [root@localhost script]#
//查看脚本,含有firstname变量 [root@localhost script]# cat sh02.sh #!/bin/bash PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin export PATH read -p "please input your first name:" firstname #tell user to input their name read -p "please input your last name:" lastname echo -e "\n Your full name is:¥firstname ¥lastname" //source方法执行脚本 [root@localhost script]# source sh02.sh please input your first name:wu please input your last name:chao Your full name is:wu chao //父进程能够查看到该变量 [root@localhost script]# echo ¥firstname wu [root@localhost script]#
[root@localhost script]# test -e file1 && echo "exist" || echo "not exsit" not exsit [root@localhost script]# test -e sh01.sh && echo "exist" || echo "not exsit" exist [root@localhost script]#
文件类型判断
test -e filename
测试标志 | 表明意义 |
-e | 该文件名是否存在 |
-f | 该文件名是否存在且为文件 |
-d | 该文件名是否存在且为目录 |
-b | 该文件名是否存在且为block device设备 |
-c | 该文件名是否存在且为character device设备 |
-S | 该文件名是否存在且为一个Socket设备 |
-p | 该文件名是否存在且为一个FIFO设备 |
-L | 该文件名是否存在且为一个链接文件 |
文件权限检测
test -r filename
测试标志 | 表明意义 |
-r | 检测该文件名是否存在且有可读的权限 |
-w | 检测该文件名是否存在且有可写的权限 |
-x | 检测该文件名是否存在且有可执行的权限 |
-u | 检测该文件名是否存在且有SUID的权限 |
-g | 检测该文件名是否存在且有SGID的权限 |
-k | 检测该文件名是否存在且有Sticky bit的权限 |
-s | 检测该文件名是否存在且为非空白文件 |
两个文件之间的比较
test file1 -nt file2
测试标志 | 表明意义 |
-nt | file1是否比file2新 |
-ot | file1是否比file2旧 |
-ef | file1和file2是否为同一个文件,便是否指向同一个inode |
两个整数直接的断定
test n1 -eq n2
测试标志 | 表明意义 |
-eq | 两数值相等 |
-ne | 两数值不相等 |
-gt | n1>n2 |
-lt | n1<n2 |
-ge | n1>=n2 |
-le | n1<=n2 |
判断字符串数据
测试标志 | 表明意义 |
test -z string | 判断是否为空字符串,空为true |
test -n string | 判断字符串是否为非空,空为false |
test str1=str2 | 判断字符串是否相等 |
test str1!=str2 | 判断字符串是否不相等 |
多重条件断定
测试标志 | 表明意义 |
-a | 两个条件同时成立,如test -r file -a -x file表示file同时具备r与x权限 |
-o | 任意一个条件成立 |
! | 反向状态,如test ! -x file。当file不具备x权限时返回true |
实例:
[root@localhost script]# cat sh05.sh #!/bin/bash PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin export PATH echo -e "please input a filename,i will check the file's type and permision.\n\n" read -p "input a filename:" filename test -z ¥filename && echo "you must input a filename" && exit 0 test ! -e ¥filename && echo "¥filename is not exsit!" && exit 0 test -f ¥filename && filetype="regulare file" test -d ¥filename && filetype="directory" test -r ¥filename && perm="readable" test -w ¥filename && perm="¥perm writable" test -x ¥filename && perm="¥perm executable" echo "the filename:¥filename is a ¥filetype" echo "and the permissions are: ¥perm" [root@localhost script]# sh sh05.sh please input a filename,i will check the file's type and permision. input a filename:sh02.sh the filename:sh02.sh is a regulare file and the permissions are: readable writable [root@localhost script]#
[ -z "¥HOME" ] ; echo ¥?
注意中括号两端都有空格符。
当变量比较时,以下:
@localhost script]# s1="hello world" [root@localhost script]# [ "¥s1" == "hello" ]
而不可使用[ ¥s1 == "hello"]
实例:
[root@localhost script]# cat sh06.sh #!/bin/bash PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin export PATH echo -e "please input a filename,i will check the file's type and permision.\n\n" read -p "please input (Y/N):" yn [ "¥yn" == "Y" -o "¥yn" == "y" ] && echo "OK,continue" && exit 0 [ "¥yn" == "N" -o "¥yn" == "n" ] && echo "On,interrupt" && exit 0 echo "I do not know your choice " && exit 0 [root@localhost script]# sh sh06.sh please input a filename,i will check the file's type and permision. please input (Y/N):y OK,continue [root@localhost script]#
脚本执行时,后面能够跟多个参数,以下:
sh scriptname.sh opt1 opt2 ...
则¥0表示执行的文件名,¥1表示第一个参数……
¥#:表明参数个数
¥@:表明"¥1","¥2","¥3","¥4"之意,每一个变量独立
¥*:表明"¥1c¥2c¥3c¥4",c为分隔符,默认为空格
[root@localhost script]# cat sh07.sh #!/bin/bash PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin export PATH echo -e "The script name is ==> ¥0" echo -e "Total parameter number is ==> ¥#" [ "¥#" -lt 2 ] && echo "The number of parameter is less than 2.Stop here." && exit 0 echo "Your whole parameter is ==> '¥@'" echo "The 1st parameter is ==> ¥1" [root@localhost script]# sh sh07.sh one two three four The script name is ==> sh07.sh Total parameter number is ==> 4 Your whole parameter is ==> 'one two three four' The 1st parameter is ==> one [root@localhost script]#
if [ 条件判断式1 ]; then 执行操做 elif [ 条件判断式2 ]; then 执行操做 else 执行操做 fi
当一个变量存在多个既定变量内容时,可使用该语句针对不一样的语句内容执行相应的操做。
case ¥变量名 in “第一个变量内容”) 程序段 ;; “第二个变量内容”) 程序段 ;; *) #表示全部其余值得状况 程序段 esac
举例:
[root@localhost script]# cat sh08.sh #!/bin/bash PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin export PATH case ¥1 in "hello") echo "hello,how are you?" ;; "") echo "you must input parameters, ex>{¥0 someword}" ;; *) echo "Usage ¥0 {hello}" ;; esac [root@localhost script]# sh sh08.sh wuchao Usage sh08.sh {hello} [root@localhost script]# sh sh08.sh hello hello,how are you? [root@localhost script]#
function的设置必定要在程序的前面
[root@localhost script]# cat sh08.sh #!/bin/bash PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin export PATH function printit(){ echo -n "Your choice is " } case ¥1 in "one") printit;echo ¥1 | tr 'a-z' 'A-Z' ;; "two") printit;echo ¥1 | tr 'a-z' 'A-Z' ;; *) echo "Usage ¥0 {one|two|three}" ;; esac [root@localhost script]# sh sh08.sh one Your choice is ONE [root@localhost script]#
while [ condition ] do 程序段落 done
或
until [ condition ] do 程序段落 done
for var in con1 con2 con3... do 程序段落 done
示例1:循环遍历多个字符串
[root@localhost script]# cat sh08.sh #!/bin/bash PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin export PATH function printit(){ echo -n "Your choice is " } for animal in dog cat tiger do printit;echo "¥{animal}" done [root@localhost script]# sh sh08.sh Your choice is dog Your choice is cat Your choice is tiger [root@localhost script]#
示例2:显示/etc/passwd的用户名和id信息
[root@localhost script]# cat sh08.sh #!/bin/bash PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin export PATH function printit(){ echo -n "Your choice is " } users=¥(cut -d ':' -f1 /etc/passwd) for username in ¥users do echo -n "id of user is : ";id ¥username #id指令用于获取用户的id信息 echo -e "username is :¥{username} \n" done [root@localhost script]# sh sh08.sh id of user is : uid=0(root) gid=0(root) 组=0(root) username is :root id of user is : uid=1(bin) gid=1(bin) 组=1(bin) username is :bin id of user is : uid=2(daemon) gid=2(daemon) 组=2(daemon) username is :daemon id of user is : uid=3(adm) gid=4(adm) 组=4(adm) username is :adm id of user is : uid=4(lp) gid=7(lp) 组=7(lp) username is :lp id of user is : uid=5(sync) gid=0(root) 组=0(root) username is :sync
示例3:遍历数值序列
[root@localhost script]# cat sh09.sh #!/bin/bash PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin export PATH function printit(){ echo -n "Your choice is " } network="192.168.247.129" for sitenu in ¥(seq 1 100) do ping -c 1 -w 1 ¥{network}.¥{sitenu} &> /dev/null && result=0 || result=1 if [ "¥result"==0 ];then echo "Server ¥{network}.¥{sitenu} is UP." else echo "Server ¥{network}.¥{sitenu} is DOWN." fi done [root@localhost script]# sh sh09.sh Server 192.168.247.129.1 is UP. Server 192.168.247.129.2 is UP. Server 192.168.247.129.3 is UP. Server 192.168.247.129.4 is UP. Server 192.168.247.129.5 is UP. Server 192.168.247.129.6 is UP. Server 192.168.247.129.7 is UP. Server 192.168.247.129.8 is UP. Server 192.168.247.129.9 is UP.
for ((初始值;限制值;执行步长)) do 程序段 done
示例
[root@localhost script]# cat sh10.sh #!/bin/bash PATH=/usr/local/java/jdk1.8.0_91/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:/root/bin:~/bin export PATH function printit(){ echo -n "Your choice is " } read -p "please input a number,I will count for 1+2+2+...+yourinput:" nu s=0 for ((i=1;i<=¥nu;i=i+1)) do s=¥((¥s+¥i)) done echo "The result of 1+2+3+...+¥nu is ==> ¥s" [root@localhost script]# sh sh10.sh please input a number,I will count for 1+2+2+...+yourinput:100 The result of 1+2+3+...+100 is ==> 5050 [root@localhost script]#
参数:
-n:不执行script,仅查询语法问题
-v:在执行script前,先将script的内容输出到屏幕
-x:将使用到的script输出到屏幕