SHELL学习点滴
Apr 14
1.利用date和$$(当前进程ID)来创建唯一日志文件
# > 输入,date 获取日期,$$获取当前进程ID
>'/home/yangjs/ss/log.'`date +%Y%m%d`$$

2.信号
0 退出当前shell
1  挂起或父进程被杀死
2  来自键盘的中断信号,通常是< C T R L - C >
3  从键盘退出
9  无条件终止
11  段(内存)冲突
15 软件终止(缺省杀进程信号

例子:捕获信号并采取相应动作

trap "my_exit" 2
loop=0
my_exit()
{
echo 'you just hid ctrl+c,at number '$loop
exit 1
}
#开始一个无限循环
while :
do
loop=`expr $loop + 1`
echo $loop
done



Apr 14
#!/bin/sh
tput clear
cat <---------------------------------------
下面,我们来练习shell的命令
---------------------------------------
MYHEAD
echo '显示当前目录--pwd:'
pwd

echo '脚本内部设置参数--set'
set hello moto
while [ $# != 0 ]
do
echo $1
shift
done

echo '给出用户脚本或任何系统命令的运行时间--times'
times

echo '命令验证--type:'
#验证times是否为当前shell命令
type times
#验证自定义的命令myfunc是否还在当前shell中
type myfunc

cat <shell显示限制命令--ulimit
格式:ulimit potions
选项:  -a 显示当前限制,
  -c 显示当前内核垃圾限制大小,
  -f 显示限制运行进程创建的输出文件大小
例子:显示当前限制
MYBODY
ulimit -a
echo '将当前内核垃圾数目设置为1;'
ulimit -c 1
echo '再显示当前限制'
ulimit -a

echo '等待进程完成命令,可指定进程ID--wait'
Apr 13
1.shift 参数偏移命令 ss/sg.sh

#!/bin/sh
loop=0
while [ $# -ne 0 ]
do
echo $1
shift
done

eval echo \$$#;



使用:
. ss/sg.sh hello moto
Apr 13
1.简单例子

第一步:编写函数 ss/func.sh

function hello(){
echo 'hello func';
}

第二步:将函数载入到shell(通过定位文件方式引入)

. ss/func.sh


第三步:使用函数

/home/yangjs>hello #使用函数hello
hello func    #函数运行结果


2.带参数的函数

function findsomething(){
# $#表示参数个数
if [ $# -lt 1 ]; then
echo "thare are no params input";
return 1;
else
echo "there are some params input";
find /home/yangjs -name $1 -print
return 0
fi
}

执行函数
/home/yangjs>findsomething ss

删除函数
unset findsomething
Apr 9
1.if 举例:/home/yangjs>cat ss/if.sh

echo -n "enter your name:"
read NAME
if [ "$NAME" = "" ]
then
echo "your name is empty!"
else
echo "your name is :${NAME}"
fi


2.空动作命令 ":"

3.case
case 格式如下:
case $v in
a) dosomething
;;
b) doantherthing
;;
*)else do something other
esac

一个简单的例子:/home/yangjs>cat ss/case.sh

echo "enter yes or no"
read f
case $f in
yes|YES|Yes|Y|y) echo "your input yes";;
NO|n|N|No) echo "your input no";;
#否则 不进行任何操作
*) :;;
esac



4.for
f o r循环一般格式为:
for 变量名i n列表
d o
命令1
命令2⋯
d o n e

例子:对for使用参数 ss/for.sh

for p  #这里对for使用参数形式而不是 in形式
do
if [ "$p" != "" ]  #注意,不要用()代替[ ]
then
echo "p is not  empty:"$p
else
echo "p is empty"
fi
done

执行:. ss/for.sh

看下下面2个for例子:批量删除文件及转化内容

for f in `ls /home/yangjs/ss | find /home/yangjs/ss -name "*.bak" `
do
rm $f
done

for ff in `ls /home/yangjs/ss | find /home/yangjs/ss -type f`
do
cat $ff | tr [a-z] [A-Z]>"$ff.bak"
done

counter=0
echo '########统计当前路径下文件数##############'
for f in *
do
#这里要注意 不要直接counter=$counter+1 使用expr时,里面的运算符(+)两边要有空格
counter=`expr $counter + 1`;  
echo "$f"
done
echo '#######################################'
echo "there are $counter files "


5.while命令
w h i l e循环用于不断执行一系列命令,也用于从输入文件中读取数据,其格式为:
while 命令
d o
命令1
命令2
. . .
d o n e
while举例:

#!/bin/sh
#一个简单的累加计数
counter=0;
while [ $counter -lt 5 ]
do
counter=`expr $counter + 1`
echo $counter
done

#一个获取用户输入
echo 'while test:user ctrl-d to end input.'
echo -n 'input your inpt msg:'
while read myinput
do
echo "your input:"$myinput
done

#修该分隔符为自定义分隔符 并忽略注释行
SAVEDIFS=$IFS
IFS=";"
while read user pass
do
#忽略注释行
case $user in
\#*);;
*)echo "$user\t $pass";;
esac
done </home/yangjs/ss/user.db
IFS=$SAVEDIFS



6.流程控制demo-菜单

#设置几个显示TITLE,日期:主机:用户
MYDATE=`date +%Y-%m-%d" "%H:%M`
MYHOST=`hostname -s`
MYNAME=`whoami`

#利用while的空命令接收键盘输入指令
while :
do
#清屏
    tput clear
#通过cat输出用户界面
    cat <<MAYDAY
---------------------------------------------------
User:$MYNAME  Host:$MYHOST  Date:$MYDATE
---------------------------------------------------
  1:List files
  2:use vi editor
  3:see who is on the system
  H:help
  Q:exit Menu
---------------------------------------------------
MAYDAY
echo -e -n "\tYour Choice[1,2,3,H,Q]"
read CHOICE
case $CHOICE in
1)ls -l;;
2)vi;;
3)who;;
h|H)cat <<MAYDAY
this is nothing to help you !
MAYDAY
;;
Q|q)tput clear;exit 0;;
*)echo -e "what are you doing?";;
esac
#通过read控制指令完结
echo -e -n "\tpress any key to contine"
read DUMMY
done

分页: 1/5 第一页 1 2 3 4 5 下页 最后页 [ 显示模式: 摘要 | 列表 ]