日期:2014-05-16  浏览次数:20601 次

Linux脚本收集

1.遍历目录
#!/bin/bash

files=`ls`? #$(ls)
fs=($files) #($files)是将字符串分割填充到数组
fssize=${#fs[*]}

for ((i=0;i<fssize;i++))
do
echo ${fs[i]}
done

2.各种括号的用法
${a} 变量a的值, 在不引起歧义的情况下可以省略大括号.
$(cmd) 命令替换, 结果为shell命令cmd的输出, 和`cmd`效果相同, 不过某些Shell版本不支持$()形式的命令替换, 如tcsh.
$((exp)) 和`expr exp`效果相同, 计算数学表达式exp的数值, 其中exp只要符合C语言的运算规则即可, 甚至三目运算符和逻辑表达式都可以计算.
(cmd1;cmd2;cmd3) 新开一个子shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后可以没有分号.
{ cmd1;cmd2;cmd3;} 在当前shell顺序执行命令cmd1,cmd2,cmd3, 各命令之间用分号隔开, 最后一个命令后必须有分号, 第一条命令和左括号之间必须用空格隔开.

对{}和()而言, 括号中的重定向符只影响该条命令, 而括号外的重定向符影响到括号中的所有命令.

(element1,element2,element3) 用于初始化数组.

{xxx,yyy,zzz...}?大括号扩展,如:?

cat {file1,file2,file3} > combined_file?# 把file1,file2,file3 连接在一起,并且重定向到combined_file中.??

cp file22.{txt,backup}?# 拷贝"file22.txt" 到"file22.backup" 中

注意: ?在大括号中,不允许有空白,除非这个空白是有意义的.

?

一个命令可能会对大括号中的以逗号分割的文件列表起作用[1]. file globbing 将对大括号中的文件名作扩展.

?

?

(()) 增强括号的用法, 常用于算术运算比较. 双括号中的变量可以不使用$符号前缀, 只要括号中的表达式符合C语言运算规则, 支持多个表达式用逗号分开.
比如可以直接使用for((i=0;i<5;i++)), 如果不使用双括号, 则为for i in `seq 0 4`或者for i in {0..4}.
再如可以直接使用if (($i<5)), 如果不使用双括号, 则为if [ $i -lt 5 ].
[ $UID -eq 10 ] 比较命令,用于条件测试,
[[ $UID -eq 0 && $USER -eq root ]] 增强型比较命令,双括号中的表达式可以使用&&, ||, <, >等C语言语法.
比如可以直接使用if [[ $a != 1 && $a != 2 ]], 如果不适用双括号, 则为if [ $a -ne 1] && [ $a != 2 ]或者if [ $a -ne 1 -a $a != 2 ].

?

3.&&和||

cmd1&&cmd2&&cmd3... 当cmd1的结果为0(即执行正确时)执行cmd2,以此类推。

如:echo -n "hello "&&echo "world"

cmd1||cmd2||cmd3... 当cmd1的结果为非0(即执行错误时,cmd1已执行)执行cmd2,以此类推。

如:[ 0 -eq 0 ]||echo "OK!" #不输出OK! ,如果是[ 0 -eq 10 ]&&echo "OK!"会输出OK!?

?

4.关于脚本开头的#!/bin/bash

脚本开头的#!/bin/bash是指定一个解释器,实际上#!是一个2字节的魔法数字,是文件类型的特殊标记,魔法数字可以通过man magic查看更详细的解释,在file命令中魔法数字可以用来检查文件类型,查看man file,文件类型按照三种方式来检查,以此顺序:文件系统,魔法数字,语言;

?

(1).文件系统检查是建立在对 stat(2) 系统调用结果的分析上的.?

(2).幻数检查用来检查文件中是否有特殊的固定格式的数据.文件在文件开始部分附近的一个特殊位置保存有一个'幻数' , 通过幻数告诉UNIX 操作系统此文件是二进制可执行文件, 和其中包含的

其它类型. 幻数的概念已经扩展到数据文件.任何在文件固定位置有与文件类型相关的不变标识符的文件都可以这样表示. 这些文件中的信息可以从幻数文件 /usr/share/magic 中读取.

(3).如果文件为 ASCII 文件, file 会试图检查它的语言. 语言检查在文件开始的几个块中(任意位置)查找是否有特殊字符串(参看 names.h) .br 指出此文件很可能是 troff(1) 输入文件, 而关键字 struct 指出此文件是C程序. 语言检查不如前两组检查可靠,所以放在最后执行.

?

当然"#!" 也可以被忽略,不过这样你的脚本文件就只能是一些命令的集合,不能够使用shell 内建的指令了,如果不能使用变量的话,当然这也就失去了脚本编程的意义了.?

如果在脚本的里边还有一个#!行,那么bash将把它认为是一个一般的注释行.

小技巧:

1).自动删除自己的脚本,后面的都不会执行

?

1 #!/bin/rm 
2 # 自删除脚本.
3 # ls  #不会执行的代码

?你还可以试试在一个README 文件的开头加上#!/bin/more, 并让它具有执行权限.?结果将是文档自动列出自己的内容.

?

?

?

?

?

?

?