#####进程 系统中的每个进程都不是凭空出现的,而是经过它的父进程建立出来的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/passwd
中 cat /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"
还有相似的二元操做符
分支较多的时候使用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