Linux Shell脚本极简入门

cp test[1-5] /tmp      --test1, test2, test3, test4, test5若存在,就将其复制到/tmp下   还有如:cp *[A-Z]*等,如果有大写字母,就把文件copy下来
command1 && command2   --第一个command1 的执行结果如果有错误,第二个就不被执行
command1 || command2   --第一个command1 的执行结果如果有错误,第二个才被执行

7、绝对路径和相对路径

系统默认是不主动搜寻当前目录下的执行文件。所以执行当前目录的命令,需要用到./command  --安全性考虑  
8、命令重定向

重定向(redirect):将您目前的所得数据转到其他地方
例:ls -l / > test,大于号“>”就是将输出结果导向到test文件的意思。
该文件(就是test)若不存在,系统会自动建立它;
若这个文件存在,系统会先将这个文件内容清空,然后再将数据写入。也就是说,若以 > 将内容输出到一个已有文件中,该文件的原有内容就会被覆盖掉。

<        --由 < 的右边读入参数文件 将原本需要由键盘输入的数据经由文件读入
>        --将原本由屏幕输出的正确数据输出到 > 右边的file(文件名称)或device(设备,如printer)
>>       --将原本由屏幕输出的正确数据输出到 >> 右边,与 > 不同的是,该文件将不会被覆盖,而新的数据将以累加方式添加到文件的最后面
2>       --将原本应该由屏幕输出的错误数据输出到2>的右边  标准输出:代码为1
1>         --标准输出:代码为1,或称为stdout
/dev/null   --可以视为垃圾设备,垃圾处理机

ls -al 1> list.txt 2> list.err   --将显示数据正确输出到 list.txt,错误的数据输出到list.err
ls -al 1> list.txt 2>&1          --将显示数据不论正确或错误均输出到list.txt中。注意,错误与正确信息输出到同一个文件中,则必须以上面的方法来写,不能写成其他格式
ls -al 1> list.txt 2> /dev/null  --将显示的数据,正确的输出到list.txt,错误的数据予以丢弃!
mail -s "test" root < /root/.bashrc    --将.bashrc内容寄给root

9、管线命令

管线(pipe)命令使用的是“|”界定符号,管线命令“|”仅能处理经由前一个指令传来的正确信息,也就是标准输出(Stdout)信息,对于标准错误信息并没有直接处理能力。每个管线部分都是指令,而后一个指令的输入乃是前一个指令的输出。

常用管线命令:

cut -d "分隔字符" [-cf] fields  
        -d后面接为分割字符,默认为空格符 
        -c后面接的是第几个字符 
        -f后面接的是第几个区块
sort [-t 分隔符] [(+起始)(-结束)] [-nru]  
        -t 分隔符 使用分隔符隔开不同区块,默认是tab  
        +start -end 由start区块排序到end区块 
        -n 使用纯数字排序(否则使用字母排序) 
        -r 反向排序  
        -u 相同出现的行只列出一次
wc [-lmw]
        -l 多少行
        -m 多少字符
        -w 多少字
uniq    --删除重复的行只显示一个  uniq所认为的重复行是指连续出现的重复行
tree    --以树状图列出目录的内容
tr     [-ds] SET1   -- d删除SET1这个字符串 s取代重复字符  例:tr '[a-z]' '[A-Z]'  将小写改成大写
split  [-bl] n 输入文件 输出文件前导字符  -- b以文件size来分  l以文件行数来分 n多少行或字节为一个文件
xargs 
awk    awk [-参数 变量] 'BEGIN{初始化}条件类型1{动作1}条件类型2{动作2}。。。。END{后处理}'
       其中:BEGIN和END中的语句分别在开始读取文件(in_file)之前和读取完文件之后发挥作用,可以理解为初始化和扫尾。

三、压缩指令与正规表示法

1、压缩指令

compress  [-d]   --用来压缩与解压缩后缀名为*.Z的指令  d为解压缩参数,也可以用uncompress代替
bzip2 [-dz] filename   --压缩解压缩后缀名为*.bz2的指令 d为解压缩参数,也可以用bunzip2代替  z为压缩参数  .bz,.bz2,.tbz,.tbz2也可尝试用该命令解压
bzcat             --读取*.bz2的内容
gzip  [-d#]        --用来压缩与解压缩后缀名为*.gz的指令 -#压缩等级,1最不好,9最好,6默认值
zcat             --这个指令可以同时读取compress与gzip的压缩文件
tar [-zxcvfpP] filename      
    -z     --是否同时具有gzip   例tar -zcvf directory.tar.gz directory  
    -x     --解开一个压缩文件
    -t     --查看*.tar里面的文件    
    -c     --建立一个压缩文件
    -v     --压缩过程中显示文件
    -f     --使用文件名
    -p     --使用原文件的原有属性(属性不会依据用户而变)
    -P     --可以使用绝对路径
    -N     --比后面接的日期(YY/MM/DD)还要新的文件才会被打包进新建的文件中 例tar -N '2002/06/25' -zcvf home.tar.gz /home
--exclude FILE   --在压缩过程中,不将FILE打包  例tar -zcvf host.tar.gz / --exclude /mnt --exclude /proc 不将/mnt和/proc 打包
cpio -covB  > [file|device]     --备份
cpio -icduv < [file|device]     --还原
cpio无法直接读取文件,需要每个文件或目录的路径连同文件名一起才可以被记录下来,因此,cpio最常跟find指令一起使用。可以备份任何文件,包括/dev下的任何设备文件。
    -o     --将数据复制输出到文件或设备上
    -i     --将数据自文件或设备复制出到系统中
    -t     --查看CPIO建立的文件或设备的内容
    -c     --以一种较新的便携格式(portable format)储存
    -v     --让储存过程中文件名称可以在屏幕上显示
    -B     --让默认的Blocks可以增至5120bytes,默认为512bytes。这样的好处是可以让大文件的储存速度加快
    -d     --自动建立目录,由于cpio的内容可能不在同一目录内,如此在反备份过程会有问题。这个时候加上-d,就可以将需要的目录自动建立起来。
    -u     --自动用较新的文件覆盖较旧的文件

2、正规表示法

grep "word" filename 将文件中包含word的那一行显示出来

常见通配符及含义
^                 --句首字符相符
$                 --句尾相同的字符
?                 --任何一个单一字符
*                 --随意几个任意字符
                --跳转符号,将特殊字符变成普通字符
[list]            --列表中的字符
[range]           --列表中范围内的字符
[^list]           --反向选择,与 [list] 相反
[^range]          --反向选择,与 [range]相反
{n}             --与前一个相同字连续n个
{n,m}           --与前一个相同字连续n-m个

示例:
grep ^[w-z] /etc/*   只要句首是W-Z就把它列出
grep [XYZ] /etc/*    只要含有XYZ中任何一个字符就把它列出

四、学习使用Shell Scripts

1、脚本的执行

执行脚本,bash根据以判断执行的步骤为:
如果执行到一个Enter符号(CR),就尝试开始执行该行命令。
指令间多个空白将被忽略;空白行也将被忽略,且Tab也不会被理会。
如果一行内容太多,则可以使用延伸至下一行。
此外,使用最多的#可做为注释。任何加在#后的字,将全部被视为注释文字而被忽略。

在撰写脚本时,最好养成如下良好的习惯:
先宣告使用的shell为何(特别留意这一点,在某些情况下,例如/etc/crontab,如果没有宣告使用的shell,常会出现错误信息而导致脚本无法被执行)。
    在 # 之后加上 ! 与 shell 的名称,用来宣告使用的 shell。
注明该脚本的内容功能、版本信息、作者、文件创建日期等。
每一个大步骤的主要功能(也顺便供自己未来做修改之用)。

2、卷标与运算符declare

declare [-afirx] --声明变量     例declare -i number2=2*3+5*13-32+25
  -a         --定义为数组 array
  -f         --定义为函数 function
  -i         --定义为整数 integer
  -r         --定义为只读
  -x         --定义为通过环境输出变量

例:
   declare -i a=3
   declare -i b=5
   declare -i c=$a*$b
   echo $c

3、交互式脚本
    
read 变量名              --把输入的内容放到变量中
myscript opt1 opt2 opt3 opt4  --定义一个脚本的参数代号 注:通过实践,$0只能用来定义脚本名称
   $0     $1   $2   $3   $4

4、脚本逻辑判断式与表达式

逻辑判断式
逻辑卷标            含义
1. --关于文件与目录的逻辑卷标
    -f         --常用!检测文件是否存在
    -d         --常用!检测目录是否存在
    -b         --检测是否为一个block文件
    -c         --检测是否为一个character文件
    -S         --检测是否为一个socket标签文件
    -L         --检测是否为一个符号链接文件
    -e         --检测某个东西是否存在!可以是任何东西
2. --关于程序的逻辑卷标
    -G         --检测是否由GID所执行的程序拥有
    -O         --检测是否由UID所执行的程序拥有
    -p         --检测是否为程序间传送信息的name pipe或FIFO
3. --关于文件的属性检测
    -r         --检测是否为可读属性
    -w         --检测是否为可写入属性
    -x         --检测是否为可执行属性
    -s         --检测是否为非空白文件
    -u         --检测是否具有SUID属性
    -g         --检测是否具有SGID属性
    -k         --检测是否具有sticky bit属性
4. --两个文件之间的判断与比较。例如test file1 -nt file2
    -nt        --第一个文件比第二个文件新
    -ot        --第一个文件比第二个文件旧
    -ef        --第一个文件与第二个文件为同一个文件(诸如链接文件)
5.--逻辑与(and)和或(or)
    &&         --逻辑与
    ||         --逻辑或

运算符
=          --等于
!=         --不等于
<          --小于
>          --大于
-eq        --等于
-ne        --不等于
-lt        --小于
-gt        --大于
-le        --小于或等于
-ge        --大于或等于
-a         --双方都成立(and)
-o         --单方成立(or)
-z         --空字符串
-n         --非空字符串

6、条件判断

if...then...fi

    if   [ 条件判断一 ] && (||) [ 条件判断二 ]; then    --if 是起始,后面可以接若干个判断式,使用 && 或 ||执行判断
    elif [ 条件判断三 ] && (||) [ 条件判断四 ]; then    --第二段判断,如果第一段不符合要求就转到此搜寻条件,执行第二段程序
    else         --当前两段都不符合时,就执行这段内容
    fi          --结束 if then 的条件判断

上面的意思是:中括号[]里的是条件表达式,如果是复合条件判断(如若A及B则C之类的逻辑判断),那么就需要在两个中括号之间加&&(and)或| |(or)这样的逻辑运算符。如果是多重选择,那么需要以elif(可选的,需要时才加上)新增另一个条件;如果所有的条件都不适用,则使用else(可选的)执行最后的内容。

注意:
        在 [ ] 中,只能有一个判断式;
        在 [ ] 与 [ ] 间,可以使用&&或| |结合判断式;
        每一个独立的组件之间需要用空格键隔开。

例:
    echo "Press y to continue"
    read yn
    if [ "$yn" = "y" ] || [ "$yn" = "Y" ]; then
    echo "script is running..."
    else
    echo "STOP!"
    fi

喜欢 | 6 不喜欢 | 0