Linux Shell2
#####进程 系统中的每一个进程都不是凭空出现的,而是通过它的父进程创建出来的
可以通过ps -ef
来查看系统中的进程,以及他们的状态信息,-e
的作用是列出系统的所有进程,-f
的作用是使用完整的格式显示每一个进程的信息
ps -fu
来查找用户名或者用户的UID
只要在命令提示符下执行一个命令或者脚本时,都会相应的在bash下创建一个进程,进程分为两类:前台进程和后台进程
前台进程是在命令提示符下执行的操作,当命令行执行时,需要等待相应进程终止时才能执行其他程序
后台进程不占用命令提示符
执行shell命令的时候,通过在shell命令后添加符号&
,告诉shell我们想把命令放到后台执行
查看后台进程的状态,使用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"
还有类似的二元操作符
- -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
来源:oschina
链接:https://my.oschina.net/u/2380832/blog/651016