Linux鸟哥私房菜学习笔记_第十三章 Shell Scripts

来源:互联网 发布:淘宝的代购可信吗 编辑:程序博客网 时间:2024/06/03 01:59

在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.shsource 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为空字符串,则为truetest -n string :判断字符串是否为空?若为空字符串,则为falsetest str1 = str2 :判断str1是否等于str2,若相等,则回传truetest 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 con3do        程序段done

例如:

for animal in dog cat elephantdo   echo "Thiere are ${animal}s ..."done

for num in $(seq 1 100) :seq为连续的意思,表示在1-100间循环
输入目录名,输出目录下文件的权限:

read -p "Please input a directory:" dirif [ "$dir" == "" -o ! -d "$dir" ];then        echo "The $dir is NOT exist in your system."        exit 1fifilelist=$(ls $dir)for filename in $filelistdo        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=0for (( i=1; i<=$num; i=i+1 ))do        sum=$(($sum+$i))doneecho "The result of '1+2+3+...+$num' is ==> $sum"


shell script 的跟踪与debug

sh [-nvx] scripts.sh-n :不要执行script,可查询语法的问题-v :在执行script前,先将scripts的内容输出到屏幕上-x :将使用到的script内容显示到屏幕上(很有用)


0 0