LinuxShell学习(二)

Linux Shell2

#####进程 系统中的每个进程都不是凭空出现的,而是经过它的父进程建立出来的shell

能够经过ps -ef 来查看系统中的进程,以及他们的状态信息,-e的做用是列出系统的全部进程,-f的做用是使用完整的格式显示每个进程的信息数组

ps -fu来查找用户名或者用户的UIDbash

只要在命令提示符下执行一个命令或者脚本时,都会相应的在bash下建立一个进程,进程分为两类:前台进程和后台进程less

前台进程是在命令提示符下执行的操做,当命令行执行时,须要等待相应进程终止时才能执行其余程序ui

后台进程不占用命令提示符命令行

执行shell命令的时候,经过在shell命令后添加符号&,告诉shell咱们想把命令放到后台执行code

查看后台进程的状态,使用bash内建的jobs来查看当前终端的后台进程,-l会在输出的信息添加后台进程的PID,-r只显示为running的后台进程,-s显示为状态为stopped的后台进程排序

可使用bash的内建命令fg把后台进程调回前台,指定任务号的方法是在数字前面加上一个%来表示这是一个任务号进程

使用bg命令将挂起的进程放到后台继续执行,或者使用ctrl+z字符串

stty -a会显示当前的终端使用的各类组合键eof = ^D,这里把ctrl+d定义为结束标识EOF,ctrl +c 来终止当前终端的前台进程

文本处理和字符串操做

从一个目录中取出最近5个普通文件,而且要求输出文件名和最后访问的时间 ls -lut | grep"^-"|head -5|cut -c41-

ls -t在输出文件列表的时候根据文件修改的时间排序,ls -l命令显示文件最后的访问时间,排序的结果是最近访问过的文件显示在最前面,因为目录下可能有子目录或者特殊文件使用grep "^-"来过滤,其中参数^-表示以-开始的文件,这时候获得了过滤后的有序文件列表,经过head - 5来提取数据的前5行,经过cut命令将无关信息删除-c命令会保留输出那些字符

paste将多个文件链接到一块儿,当链接两个文件的时候paste会将相同行号的行链接起来 paste -d':' file.a file.b|cat -n,-d表示指定分隔符

检测系统的shell统计他们被多少个用户使用,并把统计结果按照从多到少的顺序打印出来,每一个用户使用的登录shell都存在etc/passwdcat /etc/passwd|cut -d: f7|sort|uniq -c|sort -nr

变量

输出计算机的硬件信息

#!/bin/bash
TIME=`date`
NAME=`uname -n`
KERNEL=`uname -s`
VERSION=`uname -r`
ARCH=`uname -m`
echo
echo "info about u computer"
echo "curr $TIME"
echo "host name $NAME"

echo "arch $ARCH"
echo "version $KERNEL $VERSION"
echo
exit 0

把执行的命令放到符号""中,shell会首先执行""中的命令,而后用执行命令的结果替换掉``字符串

使用read命令把用户输入的值赋值给变量,使用unset删除一个定义过的变量

#!/bin/bash
echo

read  NAME
echo "welcome $NAME"

unset NAME

if [ -z $NAME ]
 then
 echo
 echo $NAME is null
 else

   echo "NAME IIS $NAME"

 fi

在shell脚本有时也但愿把变量定义成一个只读的常量,使用关键字read only 标识过的变量就是只读变量

shell中数组的使用

data[1]=1
data[2]=2
data[3]=3

echo $data[1] 输出数组元素1的值

echo $data[*]输出数组全部的元素
echo $data[@]同理

或者
data=(1 2 3 4 5 6) 直接赋值
data=([2]=value2 [3]=value3)
流程控制

$#表示命令行的参数的个数,-lt的意思是arg1 -lt arg2判断arg1是否小于arg2

#!/bin/bash
if [ $# -lt 2 ]
then
  #若是参数个数小于2,脚本执行退出
  echo "error"
  exit 1
elif [ $# -gt 2 ]
then
  #若是参数个数大于2,脚本执行退出
  echo "error"
fi
echo "my shell is running"

还有相似的二元操做符

  • -eq (equal to )等于
  • -ne (not equal to) 不等于
  • -le (less than or equal to )小于等于
  • -gt (greater than) 大于
  • ge (greater than equal to )大于等于

分支较多的时候使用case实现多分支结构,bash中的case 不能对数值进行匹配,每个子句必须用;;,;&,;;&来终止,其中最经常使用的是;;

#!/bin/bash
clear

echo

echo "file operation list"
echo "chose one of the following operations"

echo "[o]  open file"
echo "[d]  delete file"
echo "[r]  rname file"
echo "[m]  move file"

read operation

case "$operation" in

  "o"|"O")
    echo  "open"
    ;;
    "d"|"D")
      echo  "delete"
      ;;
      "r"|"R")
        echo  "rname"
        ;;
        "m"|"M")
          echo  "move"
          ;;
          *)

          echo "exit"
        esac
        exit 0

while 循环,ping命令的-c1参数是发送一个ECHO_REQUEST包,-w1的参数是指定每一次ping的时间是1s

#!/bin/bash
clear
NETWORK=192.168.1
IP=30
while [ "$IP" -lt "130" ]
do
echo "Pinging ${NETWORK}.${IP}"
ping -c1 -w1  ${NETWORK}.${IP} > /dev/null 2>&1
if [ "$?" -eq 0 ]
then
  echo "OK"
else
  echo "Failed"
fi
let IP=$IP+1
done
exit 0

util循环直到知足条件中止循环

#!/bin/bash
clear
QUIT_COMMAND=quit

until [ "$USER_INPUT" = "$QUIT_COMMAND" ] 
do
    echo "please input $QUIT_COMMAND to exit"
read USER_INPUT
echo
echo "u command is $USER_INPUT"
case $USER_INPUT in
  "open")
  echo "open"
  ;;
  "close")
  echo "close"
  ;;
  *)
  echo "error"
  ;;
esac

done

for循环将全部.sh文件放到文件夹test

#!/bin/bash
clear

mkdir ${HOME}/Desktop/test/test > /dev/null 2>&1
if [ $? -ne 0 ]
then
echo "dir ${HOME}/Desktop/test/test is already exits"
  exit 1
else
  echo "created"
fi
for FILE in `ls -l *.sh`

do
cp $FILE ${HOME}/Desktop/test/test/test_$FILE
#chmod -x ${HOME}/test/test_$FILE
done
exit 0

select 循环,实现若干选项的菜单用户值须要输入菜单的编号便可获得值 [ !-z $dir]来判断变量是否被设置为其中的一个菜单项

#!/bin/bash
clear

echo
echo "which do u want to list"
echo
select dir in /bin/ /usr/bin/ /usr/local/bin/ /sbin/ quit

do

if [ ! -z "$dir" ]

then
  if [ "$dir" = "quit" ]
  then
  echo
  echo "bye bye"
  break;
else
  echo
  echo
  echo "u select is $dir"
  echo
  ls -l $dir
  fi
else
  echo "error"
  #statements
fi
done
exit 0
备份文件
#!/bin/bash
clear

echo "backup files"
echo "---------"
#根据脚本所在的位置
#遍历上一级全部目录,备份其中的文件
for DIR in ../*

do
#检查是不是一个目录
  if [ -d ${DIR} ]; then
  #从路径提取出最后的目录名
    basedir=`basename ${DIR}`
    echo
    echo "create dir ${HOME}/Desktop/storage/${basedir}"
    echo
    #建立一个文件夹
    mkdir -p ${HOME}/Desktop/storage/${basedir}
    if [ $? -eq 0 ]; then
      for extension in sh c txt h
      do
        cp ${DIR}/*.${extension} ${HOME}/Desktop/storage/${basedir} 2>/dev/null
            if [ $? -ne 0 ]; then
                echo
                  echo "error ${DIR}/${extension}"
                    continue
            fi
              echo "done"
      done
    else
      exit 1
    fi
  else
    continue
  fi
done
exit 0
相关文章
相关标签/搜索