@perkyoung
2015-07-12T14:35:54.000000Z
字数 3347
阅读 1725
运维
for循环
for arg in [list]dodonefor arg in "" "" "" #多个参数for arg in "a b c ddfa" #四个参数for planet in "Mercury 36" "Venus 67" "Earth 93" "Mars 142"doecho $planetdone可以使用通配符for file in *for file in [jx]*下面将直接遍历命令行参数for arg可以使用命令来产生listfor arg in commandfor word in $(strings "$2" | grep "$1")还可以是C语言风格for (( a=1,b=1; a<= LIMIT; a++,b++ )) #注意,都没有$符号
while,更适合在循环次数未知的情况下使用
while [condition]docommandsdonevar0=0LIMIT=10while [ "$var0" -lt "$LIMIT" ]doecho -n "$var0 "$var0=`expr $var0 + 1`doneechoexit 0一个while循环可以有多个判断条件,最后一个条件决定是否退出循环同样支持C风格while (( a <= LIMIT )) 没有$
until
如果条件一直为false,则继续
until [ condition-is-true ]docommandsdone
case "$person" in"E" | "e" )commands;;[0-9] )commands;;-c | --conf )commands;;esac
PS3='choose your favorite vegetable: ' #select用的命令提示符是PS3echoselect var in "beans" "carrots" "potatoes" "onions"doechoecho "Your favorite veggie is $var"echobreak #没有break会一直执行下去,done
内建命令比外部命令更快,一般情况下,外部命令都需要单独fork出一个进程去执行,内建命令一般要访问内核.
bash重新实现了很多命令作为内建命令,比如echo
echoprintf format-string parameterprintf "PI is %1.2f\n" 3.1415926pi=$(printf "PI is %1.2f\n" 3.1415926)
read,从stdin读取一个变量的值,-a可以read数组变量
read numread num_1 num_2 #如果值输入了一个值,则另一个值是未设置状态read 如果不加参数,则把值存到了专用变量$REPLY上面多行输入,就在每行结尾假如'\',这样多行就会变为1行为这个变量赋值,如果想读入'\',就read -r varread val_1 val_2 < ./tmpwhile read linedodone < ./tmp管道find . -print | while read f ......
pushd, popd, dirs
变量let
被看做是expr的一个简化版本
let a=11let a=a+5let "a -=5"
set
set vale=10set `uanme -a` #用这个命令的结果重新设置位置参数的值variable="one two three...."set -- $variable #将位置参数设置为$variableset -- #将位置参数unset
unset 删除一个shell变量,效果是置为null,但是对位置参数无效
unset variableunset 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 newfileln 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 + 5expr 5 % 3expr $y + 1y=`expr $y + 1`z=`expr substr $string $postion $length`
datetimetouchatbatchcalsleepusleepclock
sorttsortuniq 删除已经排序的重复航 ,-c 统计每行的重复此时 uniq -c | sort -nrexpand 把每一个tab转化成空格unexpand 与上相反cut 从文件中提取特定域paste 以列的形式合并文件join 类似paste,但是他可以将具有特定标记域的行合并起来,例如cat 1.data100 shoes200 sockscat 2.data200 $10.00100 $20.00join ./1.data ./2.data100 shoes $40.00200 socks $20.00head -c 字节,-n行数tail -f 动态查看末行
grep pattern file
grepegrep "desk|document" ./test #相当于grep -E,支持正则表达式fgrep 相当于grep -Flook 可以当做查单词的利器,默认从/usr/share/dict/words中查找
其他命令
wc,sed,awktr 字符转换过滤器tr a-z A-Z #转换大小写tr -d 0-9 #删除所有数字tr -d '\015' < file > outfile #转dos到Unix,去掉了回车fold 按照指定的宽度进行折行fmt 也是折行工具col 这个命令用来滤除标准输入的反向换行符号. 这个工具还可以将空白用等价的tab来替换column 在合适的位置插入tabnl 将内容输出倒stdout,并且在非空行加入行号,和cat -n类似,不过后者空行也会有行号pr 格式化过滤器,可以对文件进行分页,输出更美观iconv 可以将文件转化为不同编码格式 ,iconv -f utf-8 -t utf-16
hostdigtraceroutepingwhoisrsync ##需要认真学习一下
jot,seq #生成一系列的整数,常用于for循环中dd ##这个命令也要好好学习一下od
usersgroupschownchgrpuseradd, userdel