分类: LINUX
2008-06-16 14:28:02
1.shell的输入输出
#!/bin/bash
echo -n "your name:" //-n说明不换行
read name //读取一个参数
echo -e ”your name is:\t$name" //-e显示转义字符。$name表示变量的值
echo "pwd:`pwd`" //``表示执行里面的命令
2.find和grep
find path -name "hello.c" //模式是完全匹配的,或者用*通配符,比如find path -name "[a-z]*" 查找path目录以及子目录下面所有以英文字母开头的文件或者目录
grep "^head*[0-9]\{5\} *tail$" path //模式是正则表达式,比如grep "echo" test -n,找出test文件中所有包含echo字符串的行并且打印出来。grep "^\." test -n找出test文件中所有以.字符开头的行并且打印出来.grep "\
-c 只输出匹配行的行数
-n 输出匹配行的行号
-i 不区分大小写
-v 显示不包含佩佩文本的所有行
例如:
find /usr/include -name "*.h" | xargs grep "sigset_t" -n 遍历include目录下所有头文件寻找通sigset_t匹配的所有行。
ps:输入输出重定向和管道的用法
输出重定向很简单,例如ls -l > ls.bak ls -l >> ls.bak
输入重定向,用于某些特殊命令,比如需要读取标准输入,或者读取文件(实际上都一样都是文件描述字),就是说要打开该文件并且要从里面读取数据的意思。最经典的非read命令莫属。 read n1 n2 ,enter之后需要从标准输入读取一行。这里可以改成read n1 n2 < test重定向从test文件读取, 还有一个经典的就是tr了,比如tr -s [a-z] 功能是删除标准输入中所有重复的小写字母,因此可以写成tr -s "[a-z]" < test 从文件读取.其他的也很多,例如grep "lin" test可以写成grep "lin" < test more test可以写成more < test等等。。。管道的话一般用于grep命令,作用实际上跟标准输入重定向的作用是类似的。比如ls | grep "test",实际上功能等于:ls > ls.bak;grep "test" < ls.bak.好好体会一下,就会发现管道前一个命令产生的结果就等于是第二个命令需要的输入的内容(比如打开某个文件里面的内容),xargs弥补了管道的另外一个不足就不说了
3.awk
a w k语言的最基本功能是在文件或字符串中基于指定规则浏览和抽取信息。a w k抽取信息后,才能进行其他文本操作。完整的a w k脚本通常用来格式化文本文件中的信息。
awk '{print $0}' filename //print all file
awk 'BEGIN {print "file begin\n"} {print $0} END {print "file end\n" } filename //add begin and end
awk '{if($1 ~ /^start/ && $2 ~ /end$/)print $0}' filename
tr命令:
tr -s "[\n]" < test 删除test文件所有的重复换行符(空行)
tr "[a-z]" "[A-Z]" < test 把test文件里面所有的字母大写
sed命令(替换字符串)
#!/bin/bash
#replace.sh
if [ $# -ne 3 ];then
echo "use format: replace.sh str_src str_to filename";exit
fi
sed "s/$1/$2/g" < $3 > TMP
mv TMP $3
4.shell的环境变量
环境变量分为系统变量和本地变量。export的变量属于系统变量。环境变量总是由父进程传递个子进程的。因此改变子进程的环境变量并不会影响到父进程的环境变量。要想真正的改变环境变量,只有修改~/.bash_profile ~/.bashrc /etc/profile
name=linhanjie //definit a variable
unset name //unset a variable
set //show all local variable
env //show all system variable
echo ${name:=newvalue} //如果没有设置name,则设置name的值为newvalue
echo ${name:?message} //如果没有设置name,则显示message信息
echo ${name:?} //如果没有设置name, 则显示系统自动信息
readonly name //设置制度变量
$# //传递给脚本的参数的个数
$0,$1,$2... //每个参数的值
$$ $? //当前进程id, 最近一次返回值
5.测试条件的命令
test 和 [ ]
测试文件状态:
test [-r -w -x -d -f -L -u] data1.txt [-a -o] [-r -w -x -d -f -L -u] data2.txt;echo $? //0表示成功,1表示失败
字符串测试:
test [-z -n] $name
test $name1 = $name2
数值测试:
test $num1 [-eq -ne -gt -lt -ge -le] $num2
expr 一般用于整数的简单计算,也可以用于字符串比较
echo "$num1 + $num2 = `expr $num1 + $num2`" // 1 + 2 = 3
6.流程控制
if [ ];then
do sth
elif [ ];then
do sth
else
do sth
fi
case $choice in
1) do sth
;;
2) do sth
;;
3|4) do sth
;;
*) do sth
;;
esac
for loop in 1 2 3 4 5
do
do sth
done
for loop
do
do sth
done
until [ ]
do
do sth
done
while [ ]
do
do sth
done