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

在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内容显示到屏幕上(很有用)


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值