linux shell基础

#########
shell
脚本
#########

很多脚本开头都是这样的:
#
/bin/bash       ##执行的子环境为 /bin/bash

测试:  vimhello.sh
     -------
     #
/bin/bash
     echo hello world
     watch -n 1 date
     -------
    
将它放入后台运行
     ps f   
查看从属关系
     [root@localhost tmp]# ps f
        PID TTY      STAT  TIME COMMAND
      30403 pts/0    Ss    0:00 -bash
      30615 pts/0    T     0:00  \_ /bin/bash ./hello.shhello.sh
      30616 pts/0    T     0:00  |   \_ watch -n 1 date
      30631 pts/0    R+    0:00  \_ ps f

  30615 ... \_ /bin/bash ./hello.shhello.sh   
能看出来,hello.sh是在/bin/bash下执行的



字符串比较运算符:  =!=-z-n
    -z  string      ##string
长度为0则为真
    -n string      ##string
长度非0则为真
       =               ##
相等
   
=             ##不相等
   
数字比较运算符:  -eq-ne-lt-le-gt-ge
    -eq         ##
等于
    -ne         ##
不等于
    -lt         ##
小于
    -le         ##
小于等于
    -gt         ##
大于
    -ge         ##
大于等于

文件状态运算符:  test-{b|c|e|f|d|r|w|x|s|L|nt|ot} FILE/DIRECTORY
    b           ##
二进制文件
    c           ##
字符设备
    e           ##
存在为真
    f           ##
常规文件
    d           ##
目录
    r           ##
可读
    w           ##
可写
    x           ##
可执行
    s           ##
套接字
    L           ##
软链接
    nt          ##
前者比后者新(最后更改时间)
    ot          ##
前者比后者旧(最后更改时间)

=======
if
语句
=======
   if []
   then

   else

   elif
   then

   fi
---------------------------------------------  
#!/bin/bash
if [ -z "$1" ]
then 
    echo ERROR:you not give me aipaddress
else  
    ping -c1 -w1 $1 &>/dev/null&& ( echo $1 is up)  ||  (echo $1 is down)
fi
----------------------------------------------

=========
case
语句
=========
    case "$1" in
    start)
    systemctl start $2
    ;;
    stop)
    systemctl stop $2
    ;;
    reload|restart)
    systemctl stop $2
    systemctl start $2
    ;;
    *)
    echo "Usage: $0(start|stop|restart|reload)"
    ;;
    esac

========
for
语句
========
    for ((i=10;i>0;i--))
    do
      
    done
       +++++++++++++++++++++
    for num in $(seq 1 $usernum)
    do

    done
       +++++++++++++++++++++
    for num in {1..30}
    do

    done

----------------------------------------------
题目:现在有两个文件 passwordusername分别存着密码与用户名,现在写一个脚本,从这两个文件里提取密码与用户名建立用户。
#!/bin/bash
usernum=$(wc -l /tmp/username |cut -d " " -f 1)
for num in $(seq 1 $usernum)
do
    user=`sed -n ${num}p/tmp/username`
    passwd=`sed -n ${num}p /tmp/passwd`
    useradd $user -p $passwd  &> /dev/null
done

题目:10秒倒计时。
#!/bin/bash
for ((i=10;i>0;i--))
do
    echo -n $i
    sleep 1
    echo -ne '\r    \r'
done

题目:把系统里所属组为mail的文件拷贝到 /mnt 下并且文件的后缀为当前时间
#!/bin/bash
datename=mail.`date +%H-%M-%S`
mkdir /mnt/$datename
find / -group mail -exec cp -p {} /mnt/$datename \; &> /dev/null  &

题目:ping 1..30通不通,通显示ok 不通显示down
#!/bin/bash
for num in {1..30}
do
         ping -c1 -w1 172.25.254.$num&> /dev/null &&(
         echo 172.25.254.$num is ok)||(
         echo 172.25.254.$num isdown)
done
---------------------------------------------------

==========
while
语句
==========
    while [ "" = "" ]
    do

    done

===========
expect
语句
===========
shell中利用expect实现自动应答脚本。
    #!/usr/bin/expect             
    #set timeout 10             ##
所有的expect命令等待响应的超时时间为10s
    spawn ./talk                    ##
选择要应答的文件,此处为  ./talk
    expect "who"                ##
判断上次输出结果里是否包含who,有则立即返回下一句send,没有则等待超时时间
    send "firefly\n"
    expect "are youhappy?"
    send "Yes,I amhappy.\n"
    expect "why?"
    send "
任性!\n"
    expect eof                      ##
在输出中搜索文件结束符,若没有这个,脚本立即退出,得不到正确结果
    interact                        ##
执行完成保持交互式状态,可以进行手工操作
    exit

##########
环境变量
##########

环境级变量:
  [root@localhost mnt]# cat test.sh
  #!/bin/bash
  echo $a
  [root@localhost mnt]# a=1
  [root@localhost mnt]# echo $a     
     1
  [root@localhost mnt]# sh test.sh
 
  [root@localhost mnt]# export a=2   ##
在当前shell下可用
  [root@localhost mnt]# sh test.sh
     2
  [root@localhost mnt]#echo $a
     2

用户级变量:
  cd /root    ##
用户家目录
  vim .bash_profile
  ------
  .
  .
  PATH=$PATH:$HOME/bin:/mnt     ##/mnt
下的 .sh 文件也能直接被执行,不用写绝对路径

  export PATH
  export a=1           ##
用户级变量$a
  .
  .
  -------
  [root@localhost ~]# source.bash_profile


系统级变量:

  [root@localhost ~]# vim/etc/profile
  [root@localhost ~]# source/etc/profile
  ------
  .
  .
  export a=2
  ------

当系统级变量与用户级变量同时存在时,以后设置的变量为准,重启shell之后,以用户级变量为准


#######
系统定制
#######

临时更改你的终端显示:
echo $PS1
PS1="LINUX >" 
[root@dns1 ~]#  改为 LINUX >


=====
别名
=====

使用:
alias
命令可以用来自定义属于自己的系统命令,写入  ~/.bashrc 文件永久生效


查看别名:
  alias   

  [root@dns1 ~]# alias
  alias cp='cp -i'
  alias egrep='egrep --color=auto'
  alias fgrep='fgrep --color=auto'
  alias grep='grep --color=auto'
  alias l.='ls -d .* --color=auto'
  alias ll='ls -l --color=auto'
  alias ls='ls --color=auto'
  alias mv='mv -i'
  alias rm='rm -i'


设置别名:
  alias mycom='echo hello;hostname'
   
格式:  alias  命令名='命令功能实现'

删除别名:
  unalias mycom
 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值