全部博文(842)
分类: LINUX
2012-05-16 16:05:24
• 如何表示vi中的文本范围
– 数字表示对应行号
• :set nu 可以显示出行号
– 当前行用,表示
– 最后一行用$表示
– 全部行用%表示
• 如何调用外部程序
– 在命令前加!
• 快速输入有规律的文本内容
– 一行一个输入48个连续的主机名
• ,!for ((i=0;i<48;i++)) ;do echo cache_$i_ip : spi-con$i ;done;
– 将当前目录下的所有数字结尾的目录名作为文件内容
• %!find –type d |grep ‘[0-9]$’|xargs –i ls -1 {}
• 不用vi的办法要保存-排序-察看-排序。。
• 在vi中排序
– 排序全部行
• :%!sort
– 去掉第2列
• :1,$!awk ‘{print $1,$3}’
– 只留下第2列大于10的列
• :%!awk ‘{if ($2>10) print $0}’
什么是Shell
变量不分类型 (没有int,char,string)
不需要声明,直接使用
赋值:name=value (左右两边不能有空格)
使用:$name ${name}
• 默认全局作用域(仅当前shell可见)
• local 限定函数局部变量
function a() { local msg; }
• 使用export导出变量,让子shell可以继承
export var=1
• source 或 .(dot) 在当前shell下执行脚本
source ./config.sh
• 自定义变量
• 环境变量 (set命名可查看)
$PATH,$IFS,$PS1,$PWD,$LINENO
• 位置参数(Positional Parameters)
$1 $2 $3 … ${10}
• 特殊参数(Special Parameters)
$#:位置参数的数量
$*:所有位置参数的内容 ($1 $2 …)
$@: 所有位置参数的内容(“$1” “$2” … )
$?:命令执行后返回的状态
$$:当前进程的进程号
$!:后台运行的最后一个进程号
$0:当前执行的进程名
• 使用eval实现变量的间接引用
x='abc def'
y='$x'
echo $y
$x
eval echo $y
abc de
• ${!p} #双重引用
a=1
b='a'
echo ${!b}
1
• ${!p*} #返回所有以p开头的变量
echo ${!P*}
PATH PIPESTATUS PPID PS1 PS2 PS4 PWD
• ${p:-word} #如果变量p不存在,返回"word”
• ${p:=word} #如果变量p不存在,返回"word",并将p的值设为"word"
• ${p:?word} #如果变量p不存在,将"word"打入STDERR
• ${p:+word} #如果变量p存在,返回"word"
• 双引号
使用双引号可解释$符号,反引号和反斜线等特殊字符
echo “$msg” => 显示msg变量值
• 单引号
与双引号类似,不同的是shell会忽略任何特殊符号
echo ‘$msg’ => 显示$msg
• 反斜杆
\c == ‘c’
• 反引号(命令替换)
用于执行系统命令并输出到变量
echo The date and time is `date`
• (list) list将在一个子shell中执行, 不会对当前shell产生影响,返回list的exit值
• { list; } 可以作组合命令用,list将在当前shell中被执行,list结尾处必须要有新行或‘;’号,返回list的exit值,list前后必须有空格
• ((expression)) 算术计算
• [ ] [[ ]] 分支测试
• name=(value1 ... valuen) 此时下标从0开始
• name[index]=value
• unset name 或 name=
• 数组下标的范围没有任何限制,同时也不必使用连续的分量
$ A=(a b c def)
$ A[3]=bb
$ echo ${A[0]} #取第一个元素
a
$ echo ${A[@]} # 取全部元素
a b c def
$ echo ${#A[@]} # 取得数组元素的个数
4
遍历数组:
• total=${#A[*]}
• for ((i = 0; i < total; i++))
• do
• echo ${A[$i]}
• done
• if list; then command;
[ elif list; then command; ] ...
[ else command; ]
fi
• case $word in
[a-z]) list ;;
*) default;;
esac
• [ $# -eq 1 ] && slen=1 || slen=0
• 对文件、字符串和数字使用test命令。test一般有两种格式:
• test condition 或 [ condition ](注意空格)
• if [ $str = “a.txt” ];then
• echo “OK"
• fi
直接测试命令:
• if grep abc a.txt &>/dev/null;then
• echo “Bingo!”
• fi
• 推荐使用[[ ]]进行条件测试
if [[ “x$str”== “xa.txt” && -f b.txt ]]
then
cmd;
fi
• -f -d -z ……
man bash
CONDITIONAL EXPRESSIONS
• if [ $a –lt 0 ]
then
echo OK
fi
• 推荐使用(( ))
if (( a > 0 ))
then
echo OK
fi
• for name [ in word ] ; do list ; done
for i in `ls *.result`;do cat $i; done
• for (( expr1 ; expr2 ; expr3 )) ; do list ;done
for ((i=0;i<100;i++));do echo $i;done
• while list; do list; done
while read line
do
echo $line
done < a.txt
• until list; do list; done