[关闭]
@perkyoung 2015-07-12T14:35:54.000000Z 字数 3347 阅读 1518

shell编程学习总结-2

运维


循环与分支

循环

for循环

  1. for arg in [list]
  2. do
  3. done
  4. for arg in "" "" "" #多个参数
  5. for arg in "a b c ddfa" #四个参数
  6. for planet in "Mercury 36" "Venus 67" "Earth 93" "Mars 142"
  7. do
  8. echo $planet
  9. done
  10. 可以使用通配符
  11. for file in *
  12. for file in [jx]*
  13. 下面将直接遍历命令行参数
  14. for arg
  15. 可以使用命令来产生list
  16. for arg in command
  17. for word in $(strings "$2" | grep "$1")
  18. 还可以是C语言风格
  19. for (( a=1,b=1; a<= LIMIT; a++,b++ )) #注意,都没有$符号

while,更适合在循环次数未知的情况下使用

  1. while [condition]
  2. do
  3. commands
  4. done
  5. var0=0
  6. LIMIT=10
  7. while [ "$var0" -lt "$LIMIT" ]
  8. do
  9. echo -n "$var0 "
  10. $var0=`expr $var0 + 1`
  11. done
  12. echo
  13. exit 0
  14. 一个while循环可以有多个判断条件,最后一个条件决定是否退出循环
  15. 同样支持C风格
  16. while (( a <= LIMIT )) 没有$

until
如果条件一直为false,则继续

  1. until [ condition-is-true ]
  2. do
  3. commands
  4. done

测试与分支

  1. case "$person" in
  2. "E" | "e" )
  3. commands
  4. ;;
  5. [0-9] )
  6. commands
  7. ;;
  8. -c | --conf )
  9. commands
  10. ;;
  11. esac

select

  1. PS3='choose your favorite vegetable: ' #select用的命令提示符是PS3
  2. echo
  3. select var in "beans" "carrots" "potatoes" "onions"
  4. do
  5. echo
  6. echo "Your favorite veggie is $var"
  7. echo
  8. break #没有break会一直执行下去,
  9. done

内部命令和内建命令

内建命令比外部命令更快,一般情况下,外部命令都需要单独fork出一个进程去执行,内建命令一般要访问内核.
bash重新实现了很多命令作为内建命令,比如echo

  1. echo
  2. printf format-string parameter
  3. printf "PI is %1.2f\n" 3.1415926
  4. pi=$(printf "PI is %1.2f\n" 3.1415926)

read,从stdin读取一个变量的值,-a可以read数组变量

  1. read num
  2. read num_1 num_2 #如果值输入了一个值,则另一个值是未设置状态
  3. read 如果不加参数,则把值存到了专用变量$REPLY上面
  4. 多行输入,就在每行结尾假如'\',这样多行就会变为1行为这个变量赋值,如果想读入'\',就read -r var
  5. read val_1 val_2 < ./tmp
  6. while read line
  7. do
  8. done < ./tmp
  9. 管道
  10. find . -print | while read f ......

pushd, popd, dirs

变量let
被看做是expr的一个简化版本

  1. let a=11
  2. let a=a+5
  3. let "a -=5"

set

  1. set vale=10
  2. set `uanme -a` #用这个命令的结果重新设置位置参数的值
  3. variable="one two three...."
  4. set -- $variable #将位置参数设置为$variable
  5. set -- #将位置参数unset

unset 删除一个shell变量,效果是置为null,但是对位置参数无效

  1. unset variable
  2. unset PATH

getopts 这个以后再看

source, . 效果和include类似,最终的结果是在代码中插入了一段代码

exec,使用一个特定的命令来取代当前进程,一旦运行结束,则会自动结束该脚本,一般情况下,遇到一个命令,shell会fork一个 进程,但是这个不会fork,而是直接替换

  1. exec echo "jdofaj"
  2. echo "dofa" #不会执行这里,
  3. 别忘了,还可以重新分配文件描述符 exec 7<./file

caller 放到函数中,会显示调用者信息
true 返回成功退出码
false 返回失败退出码
type 和which很像,鉴别是关键字还是内建命令

作业控制命令

fg,bg,kill,killall,command,builtin,enable,autoload

外部过滤器,程序和命令

基本命令

  1. cat/tac/rev 连接文件/行反转/内容反转
  2. chattr 修改文件属性,但是这个命令只运行在ext2中,比较有用的是chattr +i file,这个文件永远不变,包括root的所有操作,除非root先更改其属性
  3. ln -s 创建符号链接,即软链接,可以跨越文件系统
  4. ln -s oldfile newfile
  5. ln oldfile newfile 软硬链接,在该内容的时候,打开任何一个文件,都是改过的。但是如果删除或者重命名原文件,那么软链接讲找不到该文件,硬链接依然不受影响,软链接有一个很大的好处,就是跨文件系统

复杂命令

find

  1. find . -name "*.txt"
  2. find . -name "*.txt" -exec rm {} \; #要对文件执行操作就需要加-exec,后面跟命令,find出来的文件就会替换掉{}, 最后的‘;’是转义字符,保证传递给shell的字符,不会被转移成其他字符
  3. find ~/ -mtime 1 #列出最后一天修改的文件,atime是最后的访问时间,ctime是文件状态更改的时间
  4. find ~/ -type f -atime 3 -exec rm {} \; #删除最近三天没有被访问过的文件

xargs
给命令传递参数的过滤器,也是组合多个命令的工具,传过来的换行和空白,都将被空格取代,如果在管道中传参遇到问题,可以试试这个,一般都能成功。

  1. ls . | xargs -I '{}' -t cp ./{} $pwd 指定替换{}
  2. -n 指定每个参数的字符宽度

expr
通用求值表达式,

  1. expr 3 + 5
  2. expr 5 % 3
  3. expr $y + 1
  4. y=`expr $y + 1`
  5. z=`expr substr $string $postion $length`

时间/日期命令

  1. date
  2. time
  3. touch
  4. at
  5. batch
  6. cal
  7. sleep
  8. usleep
  9. clock

文本处理命令

  1. sort
  2. tsort
  3. uniq 删除已经排序的重复航 ,-c 统计每行的重复此时 uniq -c | sort -nr
  4. expand 把每一个tab转化成空格
  5. unexpand 与上相反
  6. cut 从文件中提取特定域
  7. paste 以列的形式合并文件
  8. join 类似paste,但是他可以将具有特定标记域的行合并起来,例如
  9. cat 1.data
  10. 100 shoes
  11. 200 socks
  12. cat 2.data
  13. 200 $10.00
  14. 100 $20.00
  15. join ./1.data ./2.data
  16. 100 shoes $40.00
  17. 200 socks $20.00
  18. head -c 字节,-n行数
  19. tail -f 动态查看末行

grep pattern file

  1. grep
  2. egrep "desk|document" ./test #相当于grep -E,支持正则表达式
  3. fgrep 相当于grep -F
  4. look 可以当做查单词的利器,默认从/usr/share/dict/words中查找

其他命令

  1. wc,sed,awk
  2. tr 字符转换过滤器
  3. tr a-z A-Z #转换大小写
  4. tr -d 0-9 #删除所有数字
  5. tr -d '\015' < file > outfile #转dos到Unix,去掉了回车
  6. fold 按照指定的宽度进行折行
  7. fmt 也是折行工具
  8. col 这个命令用来滤除标准输入的反向换行符号. 这个工具还可以将空白用等价的tab来替换
  9. column 在合适的位置插入tab
  10. nl 将内容输出倒stdout,并且在非空行加入行号,和cat -n类似,不过后者空行也会有行号
  11. pr 格式化过滤器,可以对文件进行分页,输出更美观
  12. iconv 可以将文件转化为不同编码格式 ,iconv -f utf-8 -t utf-16

通讯命令

  1. host
  2. dig
  3. traceroute
  4. ping
  5. whois
  6. rsync ##需要认真学习一下

数学命令

终端命令

混杂命令

  1. jot,seq #生成一系列的整数,常用于for循环中
  2. dd ##这个命令也要好好学习一下
  3. od

系统管理

  1. users
  2. groups
  3. chown
  4. chgrp
  5. useradd, userdel
添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注