Linux-系统管理

系统管理

tftp

nfs

samba

Shell编程

Shell是一个命令解析器

Shell 脚本是一个包含一系列命令序列的文本文件。

例:

#!/bin/sh
echo "hello world"
echo "hello!!"
mkdir /tnt

语法:

Shell脚本第一行必须是如下格式:

#!/bin/sh

符号#!用来指定该脚本文件的解析程序

当编辑好该脚本,还必须是其具有可执行属性

chmod +x filename

在进行shell编程时,以#开头的句子表示注释,知道这行结束

变量

在shell编程中,所有变量都由字符串组成,

并且不需要预先对变量进行声明,例:

#!bin/sh
#set variable a
a="hello world"
#print a
echo "A is :"
echo $a

注意定义时不要有空格

有时候容易与其他文字混淆,可以使用花括号

num=2
# 错误的表示,不会打印2nd
echo "this is $numnd"  
# 正确的表示,使用花括号
echo "this is the ${num}nd"

默认变量

$#:传入脚本的命令行参数个数
$*:所有命令行参数值,在各个参数值之间留有空格
$0:命令本身(shel文件名)
$1:第一个命令行参数
$2:第二个命令行参数

例:

#!/bin/sh
echo "number of vars:"$#
echo "value of vars:"$*
echo "value of var1:"$1
echo "value of var2:"$2

运行 ./test 1 2

输出结果

2
1 2
1
2

局部变量

在变量首次被赋值时加上local关键字可以声明一个局部变量

#!/bin/bash
hello="var1"

echo $hello

function func1 {

    local hello="var2"

    echo $hello

    }

func1

echo $hello

注意:

1.变量赋值时,“=”左右两边都不能有空格

2.BASH中的语句结尾不需要分号

if语句

if [expression]
then
    #code block
fi

if [expression]
then
    #code block
else
    #code block
fi

if [expression]
then
    #code block
else if [expression]
    then
        #code block
    else
        #code block
    fi
fi    

比较

比较操作 整数操作 字符串操作

相同 -eq =

不同 -ne !=

大于 -gt >

小于 -lt <

大于或等于 -ge

小于或等于 -le

为空 -z

不为空 -n

例:

比较整数a和b是否相等:if [ $a=$b ] (也可以用eq)

判断整数a是否大于整数b:if [ $a -gt $b ]

注意:1.在"["和"]"符号的左右都留有空格

2.“=”左右都由空格

实现对两个脚本参数的比较

#!/bin/bash
a=$1
b=$2
if [ -z $a ] || [ -z $b ]

then

    echo "please enter 2 no"

    exit 1

fi



if [ $a -eq $b ]

then

    echo "number a = number b"

else if [ $a -gt $b ]

    then

       echo "number a > number b"

    elif [ $a -lt $b ]

        then

            echo "number a < number b"

    fi
fi

判断

-e 文件已经存在

-f 文件是普通文件

-s 文件大小不为零

-d 文件是一个目录

-r 文件对当前用户可以读取

-w 文件对当前用户可以写入

-x 文件对当前用户可以执行

例:

#!/bin/sh
folder=/home
[ -r "$folder" ] && echo "Can read $folder"
[ -f "$folder" ] || echo "this is not file"

&& 左边为真执行后面的语句

|| 左边为假执行后面的语句

For循环

for var in [list]
do
    #code block
done

其中$var是循环控制变量 ,[list] 是var需要遍历的一个集合,do和done对包含循环体。

例:

#!/bin/bash
foe day in Sun Mon Tue Wed Thu Fri Sat
do
    echo $day
done

注意:在for那行,变量day是没有加“$”的,而在循环体内,echo所在的行变量$day是必须加上“$”符号的

练习:编写一个脚本统计当前目录的文件数

#!/bin/bash
a=0
for file in *
do
    a=`expr $a + 1`
done
echo "there are $a files in `pwd` need to process"

while循环

基本结构

while [ condition ]
do
    $code block
done

实验:编写脚本,将用户输入的数字按倒序的方式输出

#!/bin/bash

#input data
echo -n "Input number to reverse: "
read input

#define parameter
result=""
tmp=0
in=$input

#process
while [ $in -gt 0 ]
do
    tmp=$(($in % 10))
    in=$(($in/10))
    result=$(echo $result$tmp)
done

#print result
echo "$input in a reverse order is: $result" 

ps:不懂为什么要加两层(())

until循环

基本结构

until [ condition ]
do
    #code block
done

while和until的区别,while为真时执行,until为假时执行

实验:移动一个文件,如果目标文件存在该文件,则监视该文件,直到该文件被删除才移动该文件

#!/bin/bash
if [ "$1" = "" ] || [ "$2" = "" ]
then
    echo "Please enter file name"
    exit 1
fi
if [ -e $2 ]
then
    echo "The file already exists"
    until [ ! -f $2 ]
    do
        sleep 1
    done
fi
if [ ! `mv $1 $2` ]
then
    echo "mv sucessful"
else
    echo "mv error"
fi

Case语句

case "$var" in
condition 1 )
    ;;
condition 2 )
    ;;
*)
    default statments;;
esac

例:

#!#!/bin/bash
echo "Hit a key, then hit return"
read Keypress
case "$Keypress" in
    [A-Z] ) echo "Uppercase letter";;
    [a-z] ) echo "Lowercase letter";;
    [0-9] ) echo "Digit";;
    *) echo "Punctuation, whitespace, or other";;
esac

PS:程序有问题,仅a可以识别为小写,其他识别不了

posted @ 2019-09-05 14:58  LOXO  阅读(182)  评论(0编辑  收藏  举报