在shell script撰写中的注意事项:
1.指令的执行是从上而下、从左至右的分析与执行; 2.指令、选项与参数间的空白都会被忽略掉; 3.空白行也会被忽略掉,tab键同意视为空格键; 4.如果读取到回车符,就尝试开始执行该行的命令; 5.如果一行内容太多,则可以使用\[Enter]来延伸至下一行; 6.注释使用#号
第一行#!/bin/bash在宣告这个script使用的shell名称
exit 0 :代表离开script并且回传一个0给系统.sh sh01.sh;echo $? 最后会打印0(sh01.sh 最后一行为exit 0)
在script的文件头处记录好:
script的功能; script的版本信息; script的作者与联络方式; script的版权宣告方式; script的历史记录; script内较特殊的指令,使用绝对路径的方式来下达; script运行时需要的环境变量预先宣告与设定。
read命令:提示用户输入
read -p "Please input your first name:" firstname # :提示输入first name.
date1=$(date --date='2 days ago' +%Y%m%d) :将前两天的日期赋值给date1
$(command) :小指令
total=$(($firstnu*$secnu)) :计算两个数想乘
script的执行方式差异(source,sh,script,./script)
sh sh01.sh :直接执行方式来执行script,直接执行的方式来处理时,系统会给与一支新的bash让我们执行sh01.sh source sh01.sh :利用source来执行脚本,是在父程序中执行
test :测试功能
-e :判断档名是否存在 -f :判断档名是否存在,且为档案(file) -d :判断档名是否存在,且为目录(diretory) -b :判断档名是否存在,且为一个block device装置 -c :判断档名是否存在,且为一个character devices装置 -S :判断档名是否存在,且为一个Socket档案 -p :判断档名是否存在,且为一个FIFO档案 -L :判断档名是否存在,且为一个连接档
档案权限侦测
-r :侦测该档名是否存在,且具有可读的权限 -w :侦测该档名是否存在,且具有可写的权限 -x :侦测该档名是否存在,且具有可执行的权限 -u :侦测该档名是否存在,且具有SUID的属性 -g :侦测该档名是否存在,且具有SGID的属性 -k :侦测该档名是否存在,且具有Sticky bit的属性 -s :侦测该档名是否存在,且为非空档案
档案之间的比较,如test file1 -nt file2
-nt :判断file1是否比file2新 -ot :判断file1是否比file2旧 -rf :判断file1与file2是否为同一档案,
关于两个整数之间的判定,如test n1 -eq n2
-eq :两数值相等 -ne :两数字不等 -gt :n1大于n2 -lt :n1小于n2 -ge :n1大于等于n2 -le :n1小于等于n2
判断字符串的数据
test -z string :判断字符串是否为0?string为空字符串,则为true test -n string :判断字符串是否为空?若为空字符串,则为false test str1 = str2 :判断str1是否等于str2,若相等,则回传true test str1 != str2 :判断str1是否不等于str2,若等于,则回传flase
多重条件判定
-a :and,与&&相同 -o :or,与||相同 ! :反向状态,非。
test -z string
test -e /dmtsai && echo "exit" || echo "Not exit" :判断/dmtsai是否存在
test -z $filename && echo "You must input a filename." && exit 0 :判断是否输入字符串
test ! -e $filename && echo "The filename '$filename' DO NOT exit" && exit 0 :判断文件是否存在
test -d $filename && filetype="directory" :判断是否为档案
test -w $filename && perm="perm writeable" :判断档案是否可写
[] :判断符号
1.在中括号[]内每个组件都需要有空格键来分隔 2.在中括号内的变数,最好都以双引号括起来 3.在中括号内的常数,最好都以单或双引号括起来
[ -z "$HOME" ];echo $? :判断HOME这个变量是否为空(注意:[后面需要有空格,]前面也需要有空格)
shell script 的默认变量($0,$1...)
/path/to/scriptname opt1 opt2 opt3 pt4 &0 $1 $2 $3 $4
执行脚本档名为$0这个变量,后面依次累加
$# :参数个数
$@ :所有参数内容
shift :参数偏移(shift后面可以接数字,代表拿掉最前面的n个参数)
shift :偏移1个变量 shift 3 :偏移3个变量
条件判断式(if...then)
1.单层、简单调节判断式
if [ 条件判断式 ];then 当条件成立时,可进行的指令工作内容 fi (结束if)
2.多重、复杂条件判断式
if [ 条件判断式 ];then 当条件成立时,可进行的指令工作内容 else 当条件不成立时,可进行的指令工作内容 fi
3.复杂条件判断式
if [ 条件判断式 ];then 当条件成立时,可进行的指令工作内容 elif [ 条件判断式 ];then 当条件成立时,可进行的指令工作内容 else 当以上两个条件都不成立时,可进行的指令工作内容 fi
netstat -tuln :查询目前主机有启动的服务
//以下脚本可测试本机是否开启22号端口的SSH服务
testing=$(netstat -tuln |grep ":22") if [ "$testing" != "" ];then echo "SSH is running in your system" fi
利用case......esac判断
case $变量名称 in "第一个变量内容") 程序段 ;; (此处是两个连续的分号) "第二个变量内容") 程序段 ;; *) (对后一个变量内容都会用*来代表所有其他值) 程序段 exit 1 ;; esac (最终的case结尾)
function功能:函数
function fname(){ 程序段 }
function也是拥有内建变量的,与shell script类似.但与shell script的变量不是指同一个。例如:
function printit() { echo -n "Your choice is " echo $1|tr 'a-z' 'A-Z' } function checkChoice() { case $1 in "one") printit $1; ;; "two") printit $1; ;; *) echo "Usage $0 {one|two|three}" ;; esac } checkChoice $@
循环(loop)
1.whle do done,until do done(不定循环)
当条件成立时就进行循环:
while [ condition ] do 程序段 done
当条件成立时就终止循环:
until [condition ] do 程序段 done
2.for...fo...done(固定循环)
for var in con1 con2 con3 do 程序段 done
例如:
for animal in dog cat elephant do echo "Thiere are ${animal}s ..." done
for num in $(seq 1 100) :seq为连续的意思,表示在1-100间循环
输入目录名,输出目录下文件的权限:
read -p "Please input a directory:" dir if [ "$dir" == "" -o ! -d "$dir" ];then echo "The $dir is NOT exist in your system." exit 1 fi filelist=$(ls $dir) for filename in $filelist do perm="" test -r "$dir/$filename" && perm="$perm readable" test -w "$dir/$filename" && perm="$perm writable" test -x "$dir/$filename" && perm="$perm executeable" echo "The file $dir/$filename's permission is $perm" done
for...do...done的数值处理
for((初始值;限制值;执行步阶)) do 程序段 done
输入一个数,求1到这个值的和:
read -p "Please input a number,I will count for 1+2+...+your_input:" num sum=0 for (( i=1; i<=$num; i=i+1 )) do sum=$(($sum+$i)) done echo "The result of '1+2+3+...+$num' is ==> $sum"
shell script 的跟踪与debug
sh [-nvx] scripts.sh -n :不要执行script,可查询语法的问题 -v :在执行script前,先将scripts的内容输出到屏幕上 -x :将使用到的script内容显示到屏幕上(很有用)