linux学习笔记(十)

bash脚本类似批处理,就是把许多的指令集合在一起,并提供循环,条件,判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操作,并可以完成图形工具所无法实现的功能。

####引用和转义####
引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致按字面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。
##弱引用##
将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\和!字符除外。变量扩展或命令扩展在双引号内仍起作用
##强引用##
将字符串放置在单引号中,保留字符串中所有字符的文字之,同时禁用所有扩展
##转义##
非引用的\是转义字符。它保留了下一个字符的文字值。(例如,\$PATH是确切的字符串$PATH,而非PATH变量的内容。)
[root@dns-server ~]# echo #hello world#

[root@dns-server ~]# echo \# hello world #
# hello world
[root@dns-server ~]# echo \# hello world \#
# hello world #
[root@dns-server ~]# echo '# hello world #'
# hello world #
[root@dns-server ~]# echo "# hello world #"
# hello world #
[root@dns-server ~]# echo "$HOME"
/root
[root@dns-server ~]# echo '$HOME'
$HOME




算术运算符指的是可以在程序中实现加,减,乘,除等数学运算的运算符。
operator          meaning
<VARIABLE>++       增量后
<VARIABLE>--       减量后
    -               减法
    +               加法
    **              幂运算
    *               乘法
    /               除法
    %               余数
    +=              加等
    -=              加等

循环:for循环用于值列表中的相同命令的重复
if语句:if命令检查if后面的命令或列表的退出值。如果第一个命令评估为true/零,则运行then之后的命令列表,直至任一else。如果第一个命令评估为false/非零,则运行else与fi之间的命令列表(fi代表if块的结束)

##将所有mail组的文件复制到/mnt/mail.当前时间的目录中##
#!/bin/bash
TIME=$(date +%H:%M:%S)

find / -group mail -exec cp -rp {} /mnt/mail.${TIME} \;



##连接30台主机,能连接的输出up,不能连接的输出down##
#!/bin/bash
for NUM in 172.25.254.{1..30}
do
ping -c1 -w1 $NUM &> /dev/null && echo $NUM up || echo $NUM down

done



##将passfile中的密码赋予username中的用户##
#!/bin/bash
MAXLINE=`wc -l /mnt/username |cut -d " " -f 1`
for NUM in $( seq 1 $MAXLINE )
do
        USERNAME=`sed -n ${NUM}p /mnt/username`
        PASSWD=`sed -n ${NUM}p /mnt/passfile`
        useradd $USERNAME
        echo $PASSWD | passwd --stdin $USERNAME

done




##先输出十以内的偶数,再输出十以内的奇数##
#!/bin/bash
for i in {1..10}
do
ANSWER=$[ $i % 2 ]
        while
        [ "$ANSWER" = "0" ]
        do
        echo $i
        break
        done
done
echo ================================
for i in {1..10}
do
ANSWER=$[ $i % 2 ]
        while
        [ "$ANSWER" = "1" ]
        do
        echo $i
        break
        done

done



##username中用户lee后加brother##
一:
!/bin/bash
MAXLINE=`wc -l /mnt/username |cut -d " " -f 1`
for NUM in $( seq 1 $MAXLINE )
do
        NAME=`sed -n ${NUM}p /mnt/username`
        while
        [ "$NAME" = "lee" ]
        do
        echo $NAME brother
        break
        done
        while
        [ "$NAME" != "lee" ]
        do
        echo $NAME
        break
        done

done



二:
#!/bin/bash
MAXLINE=`wc -l /mnt/username |cut -d " " -f 1`
for NUM in $( seq 1 $MAXLINE )
do
        NAME=`sed -n ${NUM}p /mnt/username`
        [ "$NAME" = "lee" ] && echo $NAME brother || echo $NAME
done  


##十秒倒计时##
#!/bin/bash
for ((i=10;i>=1;i--))
do
echo -n After ${i}s is end
echo -ne ' \r'
sleep 1

done




##一分十秒倒计时##
#!/bin/bash
MIN=$1
for ((SEC=$2;SEC>=0;SEC--))
do
        echo -n "After $MIN:$SEC  is end "
        echo -ne "\r    \r"
        sleep 1

        while
        [ "$SEC" = "0" -a "$MIN" -gt "0" ]
        do
                echo -n "After $MIN:$SEC  is end "
                echo -ne "\r    \r"
                SEC=60
                ((MIN--))
        done
done



##连接ip##
#!/bin/bash
if
        [ -z "$*" ]  ##检测命令后是否给予字符串
then
        echo ERROR:you not give me a ipaddress ##如果没有,报错
else
ping -c1 -w1 $* &> /dev/null
        if
                [ "$?" = "0" ]
        then
                echo $* is up  ##能够ping通,显示up
        else
                echo $* is down  ##不能ping通,显示down
        fi

fi



##判断数字是否是10以内的正数##
#!/bin/bash
if
        [ $1 -gt 0 -a $1 -le 10 ]
then
        echo yes
else

        echo no

fi



-gt ##大于
-ge ##大于等于
-lt ##小于
-le ##小于等于
-ne ##不等于
-eq ##等于
-ef ##看两文件的节点是否一致
-nt ##看前一个文件是否比后一个文件新
-ot ##看前一个文件是否比后一个文件老

##elif的运用##
输入linux则输出westos,输入westos则输出linux
#!/bin/bash
if
        [ "$*" = "linux" ]
then
        echo westos
elif
        [ "$*" = "westos" ]
then
        echo linux
else
        echo ERROR

fi



case语句:它能够把变量的内容与多个模版进行匹配,再根据成功匹配的模版去决定应该执行哪部分代码
##case的运用##
case $1 in
        westos)
        echo linux
        ;;
        linux)
        echo westos
        ;;
        *)
        echo error
esac


##

expect自动应答##

vim ask.sh
##################################################
#!/bin/bash
read -p "what is your name:" NAME
read -p "how old are you: " AGE
read -p "what is your class:" CLASS
read -p "are you happy : " FEEL
echo $NAME is $AGE\'s old $NAME is $CLASS student and $FEEL
#################################################
chmod +x ask.sh

vim answer.exp
########################
#!/usr/bin/expect
spawn /mnt/ask.sh
        expect "name"
        send "haha\r"
        expect "old"
        send "22\r"
        expect "class"
        send "yunwei\r"
        expect "happy"
        send "unhappy\r"
        expect eof
##########################

chmod +x anser.exp





##退出状态##
linux命令完成时,将返回推出状态。成功完成程序,将返回0的推出状态。非零退出状态通常表示发生了错误。
example:
grep的退出状态的含义:
0   在指定的文件中找到了模式
1   在指定的文件中未找到模式
>1  一些其他错误(无法打开文件、错误的搜索表达式等)

##设置环境变量##
vim test.sh
#!/bin/bash
echo $a
vim .bash_profile
PATH=$PATH:$HOME/bin:/mnt

export PATH
export a=1
source .bash_profile

vim /etc/profile
77 export PATH=$PATH:/mnt
78 export a=2
source /etc/profile    ##使环境变量生效


##判断后缀为文件,目录或设备##
#!/bin/bash
IFCMD () {
        if
        [ $1 $2 ]
        then
        echo $2 is $3
        fi
}
IFCMD -f $1 file
IFCMD -d $1 direcotry

IFCMD -b $1 block



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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值