1. 关于/tmp临时文件的理解
/tmp 下的文件在每次关机后都会被清理干净,若想手动清理,清理的时候不推荐使用rm -rf命令,这样有时会引起程序的僵死。推荐使用tmpwatch命令来进行清理。
tmpwatch简介:tmpwatch 工具从指定的目录中递归地搜索,并删除在指定时间段内没有被访问的文件。tmpwatch 一般被用来清扫那些用来临时驻留文件的目录(譬如,/tmp)tmpwatch 忽略符号链接,它不会切换文件系统,而且只删除空目录和常规文件。
tmpwatch语 法:tmpwatch [-afqv][--test][超期时间][目录...]
tmpwatch参数说明:
-a或--all 删除任何类型的文件。
-f或--force 强制删除文件或目录,其效果类似rm指令的"-f"参数。
-q或--quiet 不显示指令执行过程。
-v或--verbose 详细显示指令执行过程。
-test 仅作测试,并不真的删除文件或目录
实例:sudo /usr/sbin/tmpwatch -afv 3 /tmp (清除/tmp下三小时以内没有使用的文件,并将结果输出)。
2. cp拷贝命令的 -f参数含义为什么?
强制覆盖
3. shell脚本之shift和getopts
很多脚本执行的时候我们并不知道后面参数的个数,但可以使用$*来获取所有参数。但在程序处理的过程中有时需要逐个的将$1、$2、$3……$n进行处理,shift命令的作用就是在执行完$1后,将$2变为$1,$3变为$2,依次类推。
位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。
如下,可以自己运行看一下效果:
vim testshift.sh
#!/bin/bash
count=1
until [ $# -eq 0 ]
do
echo "第 ${count} 个参数为: $1 参数个数为: $#"
shift
count=`expr $count + 1`
done
以上程序运行结果
[root@original ~]# ./testshift.sh 1 2 3 4 5 6
第 1 个参数为: 1 参数个数为: 6
第 2 个参数为: 2 参数个数为: 5
第 3 个参数为: 3 参数个数为: 4
第 4 个参数为: 4 参数个数为: 3
第 5 个参数为: 5 参数个数为: 2
第 6 个参数为: 6 参数个数为: 1
当在shift后面添加一个数字,比如2,则运行结果如下:
[root@original ~]# ./testshift.sh 1 2 3 4 5 6
第 1 个参数为: 1 参数个数为: 6
第 2 个参数为: 3 参数个数为: 4
第 3 个参数为: 5 参数个数为: 2
在上边的程序中,要注意until [ $# -eq 0 ]这个结束条件,如果shift 2但是传递的参数是奇数个的话就会一直循环下去
对传递的参数进行求和:
if [ $# -eq 0 ]
then
echo "Usage:x_shift2.sh 参数"
exit 1
fi
sum=0
until [ $# -eq 0 ]
do
sum=`expr $sum + $1`
shift
done
echo "sum is: $sum"
4、遍历目录中的文件并且提取最后一行的数值进行加法运算得到最后的结果,不知道文件有多少行,但是最后一行的格式是一样的(如total: 123)
#!/bin/bash
total=0
function count(){
for file in `ls $1`
do
echo $1$file
if [ -f "$1${file}" ]
then
price=`tail -n 1 "$1${file}" | awk '{print $2}'`
total=`expr $total + $price`
else
echo ${file} "is directory!"
count "$1${file}/"
fi
done
}
count $1
echo "The total price is: "$total
从文件中读取数据:
read number <data.txt
for 循环读取文件的每一个字段:
#!/bin/bash
FILENAME=$1
function viewFile(){
for line in `cat $FILENAME`
do
echo $line
done
}
大小写转换
[root@original ~]# echo 'halo' | tr 'a-z' 'A-Z'
HALO
[root@original ~]# name="lockey";typeset -u name;echo $name
LOCKEY
[root@original ~]# name="LOCKEY";typeset -l name;echo $name
lockey
while逐行读取:
#!/bin/bash
FILENAME=$1
cat $FILENAME | while read LINE
do
echo $LINE
done
假如在当前面目录下有1.txt和2.txt,现在我们把它输出到halo,具体为:
find ./ -name "*.txt" | xargs cat > halo
5、普通用户免密切换到超级用户
vim /etc/pam.d/su
将第4行的#号去掉,然后将登陆用户加入 wheel组
[root@ok ok]# usermod -G wheel ok