@perkyoung
2015-07-12T14:35:54.000000Z
字数 3347
阅读 1646
运维
for循环
for arg in [list]
do
done
for arg in "" "" "" #多个参数
for arg in "a b c ddfa" #四个参数
for planet in "Mercury 36" "Venus 67" "Earth 93" "Mars 142"
do
echo $planet
done
可以使用通配符
for file in *
for file in [jx]*
下面将直接遍历命令行参数
for arg
可以使用命令来产生list
for arg in command
for word in $(strings "$2" | grep "$1")
还可以是C语言风格
for (( a=1,b=1; a<= LIMIT; a++,b++ )) #注意,都没有$符号
while,更适合在循环次数未知的情况下使用
while [condition]
do
commands
done
var0=0
LIMIT=10
while [ "$var0" -lt "$LIMIT" ]
do
echo -n "$var0 "
$var0=`expr $var0 + 1`
done
echo
exit 0
一个while循环可以有多个判断条件,最后一个条件决定是否退出循环
同样支持C风格
while (( a <= LIMIT )) 没有$
until
如果条件一直为false,则继续
until [ condition-is-true ]
do
commands
done
case "$person" in
"E" | "e" )
commands
;;
[0-9] )
commands
;;
-c | --conf )
commands
;;
esac
PS3='choose your favorite vegetable: ' #select用的命令提示符是PS3
echo
select var in "beans" "carrots" "potatoes" "onions"
do
echo
echo "Your favorite veggie is $var"
echo
break #没有break会一直执行下去,
done
内建命令比外部命令更快,一般情况下,外部命令都需要单独fork出一个进程去执行,内建命令一般要访问内核.
bash重新实现了很多命令作为内建命令,比如echo
echo
printf format-string parameter
printf "PI is %1.2f\n" 3.1415926
pi=$(printf "PI is %1.2f\n" 3.1415926)
read,从stdin读取一个变量的值,-a可以read数组变量
read num
read num_1 num_2 #如果值输入了一个值,则另一个值是未设置状态
read 如果不加参数,则把值存到了专用变量$REPLY上面
多行输入,就在每行结尾假如'\',这样多行就会变为1行为这个变量赋值,如果想读入'\',就read -r var
read val_1 val_2 < ./tmp
while read line
do
done < ./tmp
管道
find . -print | while read f ......
pushd, popd, dirs
变量let
被看做是expr的一个简化版本
let a=11
let a=a+5
let "a -=5"
set
set vale=10
set `uanme -a` #用这个命令的结果重新设置位置参数的值
variable="one two three...."
set -- $variable #将位置参数设置为$variable
set -- #将位置参数unset
unset 删除一个shell变量,效果是置为null,但是对位置参数无效
unset variable
unset PATH
getopts 这个以后再看
source, . 效果和include类似,最终的结果是在代码中插入了一段代码
exec,使用一个特定的命令来取代当前进程,一旦运行结束,则会自动结束该脚本,一般情况下,遇到一个命令,shell会fork一个 进程,但是这个不会fork,而是直接替换
exec echo "jdofaj"
echo "dofa" #不会执行这里,
别忘了,还可以重新分配文件描述符 exec 7<./file
caller 放到函数中,会显示调用者信息
true 返回成功退出码
false 返回失败退出码
type 和which很像,鉴别是关键字还是内建命令
fg,bg,kill,killall,command,builtin,enable,autoload
cat/tac/rev 连接文件/行反转/内容反转
chattr 修改文件属性,但是这个命令只运行在ext2中,比较有用的是chattr +i file,这个文件永远不变,包括root的所有操作,除非root先更改其属性
ln -s 创建符号链接,即软链接,可以跨越文件系统
ln -s oldfile newfile
ln oldfile newfile 软硬链接,在该内容的时候,打开任何一个文件,都是改过的。但是如果删除或者重命名原文件,那么软链接讲找不到该文件,硬链接依然不受影响,软链接有一个很大的好处,就是跨文件系统
find
find . -name "*.txt"
find . -name "*.txt" -exec rm {} \; #要对文件执行操作就需要加-exec,后面跟命令,find出来的文件就会替换掉{}, 最后的‘;’是转义字符,保证传递给shell的字符,不会被转移成其他字符
find ~/ -mtime 1 #列出最后一天修改的文件,atime是最后的访问时间,ctime是文件状态更改的时间
find ~/ -type f -atime 3 -exec rm {} \; #删除最近三天没有被访问过的文件
xargs
给命令传递参数的过滤器,也是组合多个命令的工具,传过来的换行和空白,都将被空格取代,如果在管道中传参遇到问题,可以试试这个,一般都能成功。
ls . | xargs -I '{}' -t cp ./{} $pwd 指定替换{}
-n 指定每个参数的字符宽度
expr
通用求值表达式,
expr 3 + 5
expr 5 % 3
expr $y + 1
y=`expr $y + 1`
z=`expr substr $string $postion $length`
date
time
touch
at
batch
cal
sleep
usleep
clock
sort
tsort
uniq 删除已经排序的重复航 ,-c 统计每行的重复此时 uniq -c | sort -nr
expand 把每一个tab转化成空格
unexpand 与上相反
cut 从文件中提取特定域
paste 以列的形式合并文件
join 类似paste,但是他可以将具有特定标记域的行合并起来,例如
cat 1.data
100 shoes
200 socks
cat 2.data
200 $10.00
100 $20.00
join ./1.data ./2.data
100 shoes $40.00
200 socks $20.00
head -c 字节,-n行数
tail -f 动态查看末行
grep pattern file
grep
egrep "desk|document" ./test #相当于grep -E,支持正则表达式
fgrep 相当于grep -F
look 可以当做查单词的利器,默认从/usr/share/dict/words中查找
其他命令
wc,sed,awk
tr 字符转换过滤器
tr a-z A-Z #转换大小写
tr -d 0-9 #删除所有数字
tr -d '\015' < file > outfile #转dos到Unix,去掉了回车
fold 按照指定的宽度进行折行
fmt 也是折行工具
col 这个命令用来滤除标准输入的反向换行符号. 这个工具还可以将空白用等价的tab来替换
column 在合适的位置插入tab
nl 将内容输出倒stdout,并且在非空行加入行号,和cat -n类似,不过后者空行也会有行号
pr 格式化过滤器,可以对文件进行分页,输出更美观
iconv 可以将文件转化为不同编码格式 ,iconv -f utf-8 -t utf-16
host
dig
traceroute
ping
whois
rsync ##需要认真学习一下
jot,seq #生成一系列的整数,常用于for循环中
dd ##这个命令也要好好学习一下
od
users
groups
chown
chgrp
useradd, userdel