Shell脚本基础介绍

shell基础简介

编写脚本通常使用某种基于解释器的编程语言。而shell脚本不过就是一些文件,我们能将一系列需要执行的命令写入其中,然后通过shell来执行这些脚本。

进入Linux系统(Ubuntu),打开终端Terminal,”$”表示普通用户,”#”表示超级用户。其实此时打开的即为shell终端。注意:Redhat/CentOS系统默认安装的shell是bash,它是sh的增强版,Ubuntu默认安装的shell是dash。通过执行:$ ll  /bin/sh ,可以发现Ubuntu中的/bin/sh指向的是dash而不是bash,/bin/sh是个软连接,你也可以通过软连接的方式使/bin/sh指向bash:$ sudo ln -s /bin/bash /bin/sh 。

shell脚本通常是一个以#!起始的文本文件,如#!/bin/bash或#!/bin/sh。Linux环境下的任何脚本语言,都是以这样一个被称为shebang的特殊行作为起始的。在这行中,字符#!被置于解释器路径之前。/bin/bash是Bash的路径。

有两种运行脚本的方式:一种是将脚本作为sh的命令行参数,另一种是将脚本作为具有执行权限的可执行文件。

将脚本作为命令行参数时的运行方式为:$ shscript.sh或$ sh /home/spring/script.sh 。如果将脚本作为sh的命令行参数来运行,那么脚本中的shebang行也就没什么用处了。

为了使shell脚本能够自己独立运行,需要具备可执行权限。要是脚本独立运行,必须利用shebang行。它通过使用位于#!之后的解释器来运行脚本。运行方式为:$ ./script.sh .

shell程序读取脚本的首行,查看shebang行是否为#! /bin/bash。它会识别/bin/bash,并在内部以如下命令行执行该脚本:$ /bin/bash script.sh

在Bash中,每个命令或是命令序列 是通过使用分号或换回符来分隔的

         字符#指明注释的开始。注释部分以#为起始,一直延续到行尾。注释行通常用于为代码提供注释信息,或者用于暂停执行某行代码。

终端打印:终端作为交互式工具,用户可以通过它与shell环境进行交互。

echo是用于终端打印的基本命令。在默认情况下,echo在每次调用后会添加一个换行符。只需要使用带双引号的文本,结合echo命令就可以将该文本在终端中打印出来。类似地,不带双引号的文本也可以得到同样的输出结果。使用单引号也可以完成同样的任务。虽然,这些方法看起来相似,但各有一些特殊用途和副作用。

在默认情况下,echo会将一个换行符追加到输出文本的尾部。可以使用标志”-n”来忽略结尾的换行符。如果需要使用转义序列,则采用echo -e 这种形式。

另一个可用于终端打印的命令是printf。它使用的参数和C语言中的printf函数一样。printf使用引用文本或由空格分隔的参数。可以在printf中使用格式化字符串,如%s、%c、%d等,还可以指定字符串的宽度、左右对齐方式等。在默认情况下,printf并不像echo命令一样会自动添加换行符,我们必须在需要的时候手动添加”\n”。

#! /bin/bash

# shell script -- test7.sh
# echo和sprintf的用法
# Spring 2015-04-22

echo "hello, beijing"
echo "$(pwd)"
echo '$(pwd)' #结果并不是希望得到的
echo $(pwd)
echo -n  what is your name?
echo 'hello, spring'
echo -e "1\t2\t3"

printf "hello, world\n"
printf "%-5s %-10s %-4s\n" No Name Mark
printf "%-5s %-10s %-4.2f\n" 1 Sarath 80.3456
printf "%-5s %-10s %-4.2f\n" 2 James 90.9989
printf "%-5s %-10s %-4.2f\n" 3 Jeff 77.564

         变量:脚本语言通常不需要在使用变量之前声明其类型。只需要直接赋值就可以了在Bash中,每一个变量的值都是字符串。无论你给变量赋值时有没有使用引号,值都会以字符串的形式存储。有一些特殊的变量会被shell环境和操作系统环境用来存储一些特别的值,这类变量被称为环境变量。

         可以使用env命令在终端中查看所有与此终端进行相关的环境变量。

         一个变量可以通过以下方式进行赋值:var=value ,var是变量名,value是赋给变量的值。如果value不包含任何空白字符(如空格),那么它不需要使用引号进行引用,反之,则必须使用单引号或双引号。

         export命令用来设置环境变量。至此之后,从当前shell脚本执行的任何程序都会继承这个变量。

         常用的环境变量有:PAHT、HOME、PWD、USER、UID、SHELL等。

#! /bin/bash

# shell script -- test8.sh
# 变量的使用
# Spring 2015-04-22

var=value #var = value 是错误的,"="两边不能有空格

echo $var #注意echo $(var) 是错误的
echo ${var}

fruit=apple
count=5
echo "We have $count ${fruit}(s)"

var1=1234567890
echo ${#var1} #获得变量值的长度

         通过shell进行数学运算:let命令可以直接执行基本的算数操作。当使用let时,变量名之前不需要再添加”$”。操作符”[]”的使用方法和let命令类似。也可以使用”(())”,但使用”(())”时,变量名之前需要加上$。expr同样可以用于基本算数操作。以上这些方法只能用于整数运算,而不支持浮点数。

bc是一个用于数学运算的高级工具,它可以执行浮点数运算并应用一些高级函数。

#! /bin/bash

# shell script -- test9.sh
# 通过shell进行数学运算
# Spring 2015-04-22

no1=4
no2=5
let result=no1+no2
echo $result #9
let result++
echo $result #10
let result+=5
echo $result #15

ret=$[ no1 + no2 ]
echo $ret #9

ret=`expr 3 + 4`
ret=$(expr $ret + 5)
echo $ret #12

ret=$[ $no1 + 6 ]
echo $ret #10

ret=$(( no1 + 16 ))
echo $ret #20

no=54
result=`echo "$no * 1.5" | bc`
echo $result #81.0

文件描述符和重定向:它是与文件输入、输出相关联的整数。它们用来跟踪已打开的文件。最常见的文件描述符是stdin、stdout、stderr。我们可以将某个文件描述符的内容重定向到另一个文件描述符中。文件描述符是与一个打开的文件或数据流相关联的整数。文件描述符0(stdin,标准输入)、1(stdout,标准输出)、以及2(stderr,标准错误)是系统预留的

当使用重定向操作符时(“>”、”>>”),当使用重定向操作符时,重定向的内容不会出现在终端,而是直接被导入文件。重定向操作符默认使用标准输出。如果想使用特定的文件描述符,你必须将描述符置于操作符之前。

可以将stderr单独重定向到一个文件,将stdout重定向到另一个文件,如:$cmd 2>stderr.txt 1>stdout.txt ;还可以利用下面的方法将stderr转化成stdout,使得stderr和stdout都被重定向到同一个文件中,如:$ cmd 2>&1 output.txt 或 $ cmd &>output.txt

从stdin读取输入的命令能以多种方式接收数据。另外,还可以用cat和管道来制定我们自己的文件描述符。

我们可以使用exec命令创建自定义的文件描述符。

#! /bin/bash

# shell script -- test10.sh
# 文件描述符的使用
# Spring 2015-04-22

# 这种方法通过截取文件的方式,将输出文本存储到文件/home/spring/temp.txt中
# 在把echo命令的输出写入文件之前,temp.txt中的内容首先会被清空
echo "This is a sample text 1" > /home/spring/temp.txt

# 这种方法会将文本追加到目标文件中
echo "This is a sample text 2" >> /home/spring/temp.txt

# 重定向脚本内部的文本块
cat <<EOF > /home/spring/log.txt
LOG FILE HEADER
This is a test log file
Function: System statistics
EOF

数组:它是shell脚本非常重要的组成部分,它借助索引将多个独立的数据存储为一个集合。Bash同时支持普通数组和关联数组。普通数组只能使用整数作为数组索引,而关联数组可以使用字符串作为数组索引。

定义数组的方法有很多种:可以在单行中使用一列值来定义一个数组;还可以将数组定义成一组索引--值。

关联数组从Bash 4.0版本开始被引入。在关联数组中,我们可以用任意的文本作为数组索引。而在普通数组中,只能用整数作为数组索引。

#! /bin/bash

# shell script -- test11.sh
# 数组的使用
# Spring 2015-04-22

array_var1=(1 2 3 4 5 6)
echo $array_var1 #1
echo ${array_var1[*]} #打印所以值

array_var[0]="test1"
array_var[1]="test2"
array_var[2]="test3"
array_var[3]="test4"
array_var[4]="test5"
echo ${array_var[0]} #打印出特定索引的数组元素内容
index=3
echo ${array_var[$index]} #打印出特定索引的数组元素内容

# 以清单形式打印出数组中的所有值
echo ${array_var[*]}
echo ${array_var[@]} #另一种方式

echo ${#array_var[*]} #打印数组长度

# 使用单独的声明语句将一个变量声明为关联数组
declare -A fruits_value
# 利用内嵌索引--值列表法或使用独立的索引--值进行赋值
fruits_value=([apple]='100 dollars' [orange]='150 dollars')
echo "Apple costs ${fruits_value[apple]}"

# 列出数组索引
echo ${!fruits_value[*]}
echo ${!fruits_value[@]} #另一种方法
使用别名:别名就是一种便捷方式,以省去用户输入一长串命令序列的麻烦。别名有多种实现方式,可以使用函数,也可以使用alias命令,如$ alias install=’sudo apt-get install’

alias命令的作用只是暂时的。一旦关闭当前终端,所有设置过的别名就失效了。为了使别名设置一直保持作用,可以将它加入~/.bashrc文件中。因为每当一个新的shell进程生成时,都会执行~/.bashrc中的命令。当你创建别名时,如果已经有同名的别名存在,那么原有的别名设置将被新的取代。

获取终端信息:tput和stty是两款终端处理工具。

获取终端的行数和列数:$ tputcols ; $ tput lines ;

打印出当前终端名:$ tputlongname

获取、设置日期和延时:我们能够以多种格式打印日期,也可以在命令行中设置日期。在类UNIX系统中,日期被存储为一个整数,其大小为自世界标准时间1970年1月1日0时0分0秒起所流逝的秒数。这种计时方式称之为纪元时或UNIX时间。

#! /bin/bash -xv

# shell script -- test12.sh
# 获取、设置日期和延时
# Spring 2015-04-22

date
date +%s

# 将日期转换成纪元时
date --date "Thu Nov 18 08:07:21 IST 2010" +%s

# 获知给定的日期是星期几
date --date "Jan 20 2001" +%A

# 用格式串结合 + 作为date命令的参数,可以按照你的选择打印出对应格式的日期
date "+%d %B %Y"

# 设置日期和时间
sudo date -s "21 June 2009 11:02:22" #需要有权限

# 计算一组命令所花费的时间
start=$(date +%s)
# 执行相关命令......
sleep 5

end=$(date +%s)
difference=$(( end - start ))
echo "Time taken to execute commands is $difference seconds"
调试脚本: 使用选项-x 启动跟踪调试shell脚本:$ bash -x script.sh 。运行带有-x标志的脚本能打印出所执行的每一行命令以及当前状态。

也可以巧妙的利用shebang来进行调试:把shebang从#! /bin/bash改成#!/bin/bash -xv,这样一来,不用任何其它选项就可以启用调试功能了。

         函数:和其它脚本语言一样,Bash同样支持函数,函数同样支持递归;函数也能像环境变量一样用export导出。

         读取命令序列输出:shell脚本可以将多个命令或工具组合起来生成输出。一个命令的输出可以作为另一个命令的输入,而这个命令的输出又会传递至另一个命令,依次类推。这种命令组合的输出可以被存储在一个变量中。这些命令被称为过滤器(filter)。我们使用管道(pipe)来连接每一个过滤器。管道操作符是”|”

         利用子shell生成一个独立的进程:子shell本身就是独立的进程。可以使用()操作符来定义一个子shell。当命令在子shell中执行时,不会对当前shell有任何影响,所有的改变仅限于子shell内

         read是一个重要的Bash命令,用于从键盘或标准输入中读取文本。可以使用read以交互的形式读取来自用户的输入。

         内部字段分隔符(InternalField Separator, IFS)是用于特定用途的定界符。IFS是存储定界符的环境变量。它是当前shell环境使用的默认定界字符串。IFS的默认值为空白字符(换行符、制表符或者空格)。

#! /bin/bash

# shell script -- test13.sh
# 演示IFS的用法
# Spring 2015-04-23

line="root:0:0:0:ront:/root:/bin/bash"

oldIFS=$IFS
IFS=":"
count=0

for item in $line
do
[ $count -eq 0 ] && user=$item
[ $count -eq 6 ] && shell=$item
let count++
done

IFS=$oldIFS
echo $user\' s shell is $shell

         for循环:用法 for varin list; list可以是一个字符串或一个序列;也可以采用C语言中for循环的格式: for((i=0;i<10;i++))

         比较:程序中的流程控制是由比较和测试语句来处理的。我们可以用if、if else以及逻辑运算符来执行测试,而用一些比较运算符来比较数据项。if和else语句可以进行嵌套。”&&”是逻辑与运算符,”||”是逻辑或运算符。条件通常被放置在封闭的中括号内。一定要注意在[或]与操作数之间有一个空格。如果忘记了这个空格,脚本就会报错。

         常用的操作符:(1)、”-eq”,等于;(2)、”-ne”,不等于;(3)、”-ge”,大于;(4)、”-lt”,小于;(5)、”-ge”,大于或等于;(6)、”-le”,小于或等于。

         使用字符串比较时,最好用双中括号,因为有时候采用单个中括号会产生错误。

         test命令可以用来执行条件检测。用test有助于避免使用过多的括号。

shell常用命令

         cat命令:(1)、通常用于读取、显示或拼接文件内容;(2)、它还能够从标准输入中进行读取,需要使用管道操作符”|”;(3)、还可以用cat将输入文件的内容与标准输入拼接在一起,也是通过管道操作符;(4)、还可以压缩空白行(也可以用tr移除空白行),通过”-s”选项;(5)、它可以将制表符重点标记出来,通过”-T”选项;(6)、使用”-n”选项会在输出的每一行内容之前加上行号。

         script和scriptreplay命令:可以把终端会话记录到一个文件中,例如:

         (1)、开始录制终端会话:$script -t 2> timing.log -a output.session  ,退出录制时在终端输入exit并按回车键即可;

         (2)、回放命令执行过程:$scriptreplay  timing.log  output.session

         script命令同样可以用于建立可在多个用户之间进行广播的视频会话。

         find命令:沿着文件层次结构向下遍历,匹配符合条件的文件,并执行相应的操作:

(1)、列出当前目录及子目录下所有的文件和文件夹:$ find /home/spring

(2)、根据文件名或正则表达式匹配搜索:$ find /home/spring -name  “*.txt”  ,”-iname”选项作用和”-name”类似,只不过在匹配名字的时候会忽略大小写;

(3)、可以用”!”否定参数的含义:$find  . !  -name  “*.txt” ,匹配所有不以.txt结尾的文件名;

         (4)、可以使用”-maxdepth”或”-mindepth”参数来限制find命令遍历的深度:$find . -maxdepth 1 -type f ,只列出当前目录下的所有普通文件,即使有子目录,也不会被打印或遍历;

         (5)、可以使用”-type”对文件搜索进行过滤,Linux文件具有不同的类型,例如普通文件(f)、目录(d)、字符设备(c)、块设备(b)、符号链接(l)、硬链接、套接字(s)以及FIFO(p)等:$ find . -type l ,只列出符号链接;

         (6)、根据文件时间进行搜索,每一个文件都有三种时间戳,访问时间(-atime)、修改时间(-mtime)、变化时间(-ctime),它们可以整数值给出,单位是天,这些整数值通常还带有-(小于)或+(大于):$ find . -type f -atime -2 -print ;打印出在最近2天内被访问过的所有文件;还有其它一些基于时间的参数是以分钟作为计量单位的,-amin、-mmin、-cmin;

         (7)、基于文件大小的搜索”-size”:$ find . -typef -size  +2k ,查找大于2KB的文件,除k之外,文件大小单元还可以用”c”(字节)、”M”(兆字节)等;

         (8)、删除匹配的文件”-delete”:$ find . -typef -name “*.swp” -delete ,删除当前目录下所有的.swp文件。

         xargs命令:将标准输入数据转换成命令行参数,也可以将单行或多行文本输入转换成其它格式。xargs命令应该紧跟在管道操作符之后:

         (1)、将多行输入转换成单行输出:$ cat example.txt  |  xargs

         (2)、将单行输入转换成多行输出:$ cat example.txt  |xargs  -n 3 ,指定每行最大的参数数量n

         (3)、用find匹配并列出所有的.txt文件,然后用xargs将这些文件删除:$find . -type f -name “*.txt” -print0  |xargs -0 rm -f

         (4)、统计源代码目录中所有C程序文件的行数:$find . -type f -name “*.c” -print0 | xargs -0 wc -l

         tr命令:可以对来自标准输入的字符进行替换、删除以及压缩;它可以将一组字符变成另一组字符:

         (1)、将输入字符有大写转换成小写:$ echo “ABC DEF XYZ” | tr ‘A-Z’ ‘a-z’

         (2)、通过”-d”删除掉指定的字符:$cat test.txt | tr -d ‘0-9’ ,删除test.txt中的数字

         校验和(checksum)程序用来从文件中生成校验和密钥,然后利用这个校验和密钥核实文件的完整性:

         (1)、md5sum命令:md5sum是一个32个字符的十六进制串,计算指定文件的md5摘要算法:$ md5sum test.txt  >test.md5

         (2)、sha1sum命令:它从给定的输入文件中生成一个长度为40个字符的十六进制串:$ sha1sum test.txt > test.sha1

         sort命令:对文本文件和stdin进行排序操作。

         (1)、参数”-n”按数字进行排序,”-r”按逆序进行排序,”-M”按月份进行排序:$sort -n test.txt

         (2)、”-k”指定了排序应该按照哪一个键(key)来进行,键指的是列号,而列号就是执行排序时的依据:$ sort -nrk 1 data.txt

         split命令:可以指定分割大小,将文件分割成多个更小的文件

         (1)、”-b”分割大小,”-d”以数字为文件名后缀,”-a”指定后缀名长度:$split -b 10M data.file -d -a 4 , “-l”根据行数来分割文件

         根据扩展名切分文件名:借助”%”操作符可以将名称部分从”名称.扩展名”这种格式的文件名中提取出来;借助”#”操作符将文件名的扩展名部分提取出来:filename=”sample.jpg”

         (1)、提取文件名:$ name=${filename%.*}

         (2)、提取扩展名:$extension=${filename#*.}

         rename命令:利用Perl正则表达式修改文件名。

#! /bin/bash

# shell script -- test14.sh
# 文件重命名
# Spring 2015-04-24

count=1;
for img in *.jpg *.bmp
do
new=image-$count.${img##*.}
mv "$img" "$new" 2> /dev/null
if [ $? -eq 0 ];
then
echo "Renaming $img to $new"
let count++
fi
done
 交互式输入:是指只有当命令要求获取输入时,才由用户手动键入。

#! /bin/bash

# shell script -- test15.sh
# 交互式输入
# Spring 2015-04-24

read -p "Enter number:" no
read -p "Enter name:" name
echo You have entered $no, $name
文件操作:UNIX将操作系统中的一切都视为文件。目录同样是一种文件。

         生成任意大小的文件用dd命令,$ ddif=/dev/zero of=junk.data bs=1M count=1 ,if代表输入文件,of代表输出文件。

         两个文件之间的比较可以使用comm命令,comm必须使用排过序的文件作为输入

         mkdir命令:用于创建目录,$mkdir -p /home/spring/abc/def/xyz/opq

         文件权限:通常包括三类权限,用户,用户组和其他用户。用户(user)是文件的所有者;用户组(group)是多个用户的集合,系统允许这些用户对文件进行某些形式的访问;其他用户(others)是除用户或用户组之外的任何用户。用命令$ ls -l可以列出文件的权限。可以参考http://blog.csdn.net/fengbingchun/article/details/45077575,可以通过chmod命令设置文件权限。可以使用chown命令更改文件的所有权。

         创建不可修改文件可以使用chattr命令:

         (1)、将文件设置为不可修改:$sudo chattr +i test.txt

         (2)、移除文件不可修改属性:$sudo chattr -i test.txt

         批量生成空白文件可以使用touch命令。”-a”只更改文件访问时间,”-m”只更改文件内容修改时间,”-d”指定特定的时间和日期。

#! /bin/bash

# shell script -- test16.sh
# 批量生成空白文件
# Spring 2015-04-24

for name in {1..10}.txt
do 
touch -d "Fri Jun 25 20:50:14 IST 1999"  $name
done

        符号链接:只不过是指向其它文件的指针,它在功能上类似于Mac OS中的别名或Windows中的快捷方式。删除符号链接不会影响到原始文件。创建一个符号链接:$ ln -s /bin/bash ~/feng_sh

         列举文件类型统计信息可以通过file命令。

#! /bin/bash

# shell script -- test17.sh
# 统计文件类型信息
# Spring 2015-04-24

if [ $# -ne 1 ]
then
echo $0 basepath
echo
fi
path=$1

declare -A statarray
while read line
do
ftype=`file -b "$line"`
let statarray["$ftype"]++
done< <(find $path -type f -print)

echo ====== File types and counts ======
for ftype in "${!statarray[@]}"
do
echo $ftype : ${statarray["$ftype"]}
done
         查找文件差异可以通过diff命令,$ diff -utest1.txt test2.txt > test.patch

         打印文件的指定行数可以使用head和tail命令:

         (1)、打印文件前5行:$ cattest.txt | head -n 5

         (2)、打印文件最后5行:$ cattest.txt | head -n 5

         只列出目录的方法

         (1)、$ ls -d */

         (2)、$ ls -F |grep “/$”

         (3)、$ ls -l |grep “^d”

         (4)、$ find .-type d -maxdepth 1 -print

         在多个目录之间进行切换可以使用pushd和popd命令。pushd总是将路径添加到栈,如果要从栈中删除路径,可以使用popd。当涉及3个以上的目录时,可以使用pushd和popd。但是当只涉及两个位置的时候,还有另一个更简便的方法:$ cd -

         统计文件的行数、单词数和字符数可以使用wc命令,Word Count的缩写:

         (1)、统计行数:$ cattest.txt | wc -l

         (2)、”-w”参数用于统计单词数,”-c”参数用于统计字符数

         打印目录树结构可以使用tree命令:$ tree/home/spring

文本处理

         正则表达式是一种用于文本匹配的通用语言。

         在文件中搜索文本使用grep命令,它能够支持正则表达式和通配符:”--color”参数可以在输出行中重点标记出匹配到的单词;”-E”参数支持扩展正则表达式;”-c”统计文件或文本中包含匹配字符串的行数;”-i”可以使匹配样式不考虑字符的大小写;”-e”来指定多个匹配样式。

         按列切分文件可以使用cut命令,显示第2列和第3列的内容:$ cut -f2,3 test.txt ,要打印多列,需要提供一个由逗号分隔的列号列表作为-f选项的参数。

         sed命令是streameditor(流编辑器)的缩写,它可以进行文本替换:$ cat test.txt | sed ‘s/a/A/g’ > tt.txt,可以通过”-i”参数,将替换结果应用于原文件。也可以使用双引号,当使用双引号时,可以在sed样式和替换字符串中指定变量。

         awk命令用于数据流,它可以对列和行进行操作

         按列合并文件:可以用paste命令实现按列拼接,而cat命令所实现的拼接通常是按照行来进行的:$ paste test1.txt test2.txt ,默认的定界符是制表符,也可以用”-d”明确指定定界符。

         以逆序形式打印行,可以通过tac命令:$ tac test.txt。

         解析文本中的电子邮件地址和URL可以通过egrep命令。

Web应用

         wget命令:可以下载网页或远程文件:$ wget  http://blog.csdn.net/fengbingchun

         curl命令可以用来执行下载、发送各种HTTP请求、指定HTTP头部等操作。

归档与压缩

         tar命令:可以用来归档文件,它可以将多个文件和文件夹保存为单个文件,同时还能保留所有的文件属性,如所有者、权限等:

         (1)、$ tar -cfoutput.tar 1.txt 2.txt ,”-c”代表创建文件(create file),”-f”代表指定文件名(specify filename),可以使用文件名列表或者诸如*.txt这类通配符来指定文件夹和文件名,文件名必须紧跟在”-f”之后,并且”-f”应该是参数组中的最后一项

         (2)、向归档文件中添加文件:$tar -rvf output.tar 3.txt ,”-r”追加选项

         (3)、列出归档文件中的内容:$tar -tvf output.tar ,需要在归档或列出归档内容的过程中获知更多细节,可以使用”-v”或”-vv”选项

         (4)、从归档文件中提取文件或文件夹:$ tar -xf output.tar ,选项”-x”表示提取(exact),可以用选项”-C”指定需要将文件提取到哪个目录

         (5)、拼接两个归档文件:$tar -Af file1.tar file2.tar ,将file2.tar的内容合并到file1.tar中

         (6)、通过检查时间戳来更新归档文件中的内容,通过选项”-u”,只有比归档文件中的同名文件更新的时候才进行添加:$ tar -uvvf file.tar  1.txt

         (7)、比较归档文件与文件系统中的内容,选项”-d”可以打印出两者之间的差别:$ tar -df file.tar 1.txt

         (8)、从归档文件中删除文件,使用”--delete”选项:$ tar -f file.tar --delete 1.txt

         (9)、使用”--totals”选项可以在归档完成之后打印出总归档字节数:$ tar -cf file.tar *.txt --totals

         cpio命令是类似于tar的另一种归档格式,它用来将多个文件和文件夹存储为单个文件,同时还能保留所有的文件属性,如权限、文件所有权等。

         gzip命令:只能够压缩单个文件,而无法对目录和多个文件进行归档

         (1)、$ gzip 1.txt,gzip会删除原文件并生成一个压缩文件1.txt.gz;将gzip文件解压缩的方法是:$ gunzip 1.txt.gz ,会删除1.txt.gz并生成1.txt

         (2)、压缩归档文件,可以用tar命令的”-z”选项:$ tar-czvvf file.tar.gz  *.txt

         (3)、提取经由gzip压缩的归档文件中的内容:$tar -xavvf file.tar.gz -C /home/spring ,”-x”用于提取内容,”-a”用于自动检测压缩格式

         bzip2命令:通常能够生成比gzip更小(压缩比更高)的文件

         (1)、$ bzip21.txt ,bzip2会删除原文件并生成一个压缩文件1.txt.bz2;将bzip2文件解压缩的方法是:$ bunzip2 1.txt.bz2 ,会删除1.txt.bz2并生成1.txt

         (2)、通过”-j”选项将bzip2与归档文件结合使用:$tar -cjvvf file.tar.bz2 *.txt

         (3)、选项”-k”避免删除输入文件:$bunzip2 file.bz2 -k

         lzma命令:它提供了比gzip或bzip2更好的压缩率:$ lzma1.txt ,会生成1.txt.lzma并删除1.txt文件,解压缩lzma文件,用unlzma命令

         zip命令:$ zipfile.zip 1.txt ,与lzma、gzip以及bzip2不同的是,zip在完成压缩之后不会删除原文件,要从zip文件中提取内容:$ unzip file.zip

         crypt命令:一个简单的加解密工具

         (1)、加密:$ crypt<1.txt>2.txt ,1.txt为需要加密的文件,2.txt为加密后的文件

         (2)、解密:$ cryptpassword -d <2.txt>3.txt ,password为2.txt的密钥,3.txt为2.txt解密后生成的文件

         gpg命令:采用密钥签名技术保护文件内容,只有经过认证的用户才能访问数据

         (1)、加密:$ gpg -c1.txt ,输入密码后,会生成1.txt.gpg文件

         (2)、解密:$ gpg1.txt.gpg ,弹出对话框,输入密码后即可解密

         base64命令:是一组类似的编码方案,它通过将ASCII字符转换成以64为基数的形式来用ASCII字符串描述二进制数据

         (1)、编码为Base64格式:$ base641.txt > 2.txt

         (2)、解密Base64格式:$ base64-d 2.txt > 3.txt

         rsync命令:可以对位于不同位置的文件和目录进行备份,它可以借助差异计算以及压缩技术来最小化数据传输量

         (1)、将源目录复制到目的端(创建镜像):$ rsync -av/home/spring/1 /home/spring/2 ,”-a”表示要进行归档,”-v”表示在stdout上打印出细节信息或进度

         (2)、可以通过”-z”选项指定在网络传输时使用数据压缩

         用Git备份版本控制

         dd命令:它能够用于克隆任何类型的磁盘,如硬盘、闪存、CD、DVD以及软盘等。

网络相关

         ifconfig命令:用于显示网络接口、子网掩码等详细信息

         (1)、打印网络接口列表:$ifconfig | cut -c-10 | tr -d ‘ ‘ | tr -s ‘\n’

         (2)、提取IP地址:$ ifconfigeth0 | egrep -o “inet addr:[^ ]*” | grep -o “[0-9.]*”

         ping命令:是一个验证网络上两台主机连通性的诊断工具,能够用来找出网络上的活动主机

系统安全及管理

         统计磁盘的使用情况使用df(diskfree)和du(disk usage)命令:

         (1)、计算某个文件(或多个文件)占用的磁盘空间:$ du1.txt 2.txt

         (2)、获得指定目录中所有文件的磁盘使用情况:$ du -a /home/spring

         (3)、计算所有文件或目录总共占用的磁盘空间:$ du -c /home/spring

         (4)、选项”-h”可以以KB、MB显示文件大小;选项”-s”只输出合计数据

         (5)、df命令提供磁盘可用空间信息

         监视程序执行所需要的时间可以使用time命令:$ time ls ,real时间指的是挂钟时间,也就是命令从开始执行到结束的时间;user时间是指进程花费在用户模式重的CPU时间,这是唯一用于执行进程所花费的时间;sys时间是指进程花费在内核模式中的CPU时间,它代表在内核中执行系统调用所使用的时间。

         要获取当前登录用户的相关信息,可以使用who或w命令。

         要列出当前登录主机的用户列表,可以使用users命令。

         要查看系统已经通电运行了多少时间,可以使用uptime命令。

         要获取前一次的启动及用户登录会话的信息,可以使用last命令。

         ps命令用于收集系统中进程的详细信息。

         watch命令可以用来在终端中以固定的间隔监视命令输出。

         top命令默认会输出一个占用CPU最多的进程列表。

         kill命令可用来向进程发送信号,而trap命令用来处理所接收的信号。

         which命令用来找出某个命令的位置:$ which ls

         whereis与which命令类似,但是它不仅返回命令的路径,还能够打印出其对应的命令手册的位置以及命令源代码的路径(如果有的话)

         file命令用来确定文件的类型:$file /bin/ls

         whatis命令会输出作为参数的命令的简短描述信息:$ whatis ls

         wall命令用来向所有当前登录用户的终端写入消息。它可以将消息传递给一台服务器中所有的当前登录用户或是多台分散主机中的用户。

         打印当前系统的主机名使用hostname命令或$ uname -n。

         打印Linux内核版本、硬件架构等详细信息用:$ uname -a

         打印Linux内核发行版本:$uname -r

         打印主机类型:$uname -m

         打印出CPU相关信息:$ cat/proc/cpuinfo

         获取处理器名称:$ cat/proc/cpuinfo | head -n 5 | tail -1

         打印内存详细信息:$cat /proc/meminfo

         打印系统可用内存总量:$cat /proc/meminfo | head -1

         列出系统的分区信息:$cat /proc/partitions

         获取系统的详细信息:$sudo lshw

         用/proc收集信息:在Linux操作系统中,/proc是一个位于内存中的伪文件系统,它的引入是为了提供一个可以从用户空间读取系统参数的接口。我们能够从中收集到大量的系统信息。

         用cron命令进行调度:它通过守护进程cron使得任务能够以固定的时间间隔在系统后台自动运行。

        

         以上内容整理自《Linux Shell脚本攻略》

你可能感兴趣的:(Shell脚本基础介绍)