ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 20天学会bash shell script (二)

20天学会bash shell script (二)

原创 Linux操作系统 作者:pingley 时间:2012-04-05 18:43:21 0 删除 编辑
20天学会bash shell script. (二)
shell 算数表达式
语法格式:
expr oprand1 math-operator op2
算数运算符:
+,- 加,减
\*, /  乘,处
% 取模
[linux@zeng bin]$ cat math.sh
#!/bin/bash
#
#This shell script. about shell arithmetic.

expr 4 + 1
expr 5 - 1
expr 20 / 4
expr 10 % 3
expr 2 \* 5

x=`expr 2 + 8`
echo "2+8 is equal $x" 
注: 在shell script. 中操作数与操作符之间需要有空格的存在。
如果需要把一个表达式的值赋给一个变量,表达式应该用反单引号括起来。
比如我们这边的x=`expr 2 + 8`
[linux@zeng bin]$ math.sh
5
4
5
1
10
2+8 is equal 10
关于shell script. 中的引号
1、双引号,被双引号包围的字符保存变,除了(\ 和 $ )。
2、单引号,被单引号包围的字符保存不变。
3、反单引号,执行被反单引号包围的命名。
[linux@zeng bin]$ cat quotes.sh
#!/bin/bash
#
#This shell script. about quotes.
#
var=100
echo "The varible var value is $var"
echo 'The varible var value is $var'
echo `pwd`
[linux@zeng bin]$ quotes.sh
The varible var value is 100
The varible var value is $var
/home/linux/bin
read 语句
大多数程序需要与用户交互。所以就不能少接受用户输入的语句。在shell 中read
可以用来接受用户从键盘的输入,并把数据存储在一个变量中。
语法格式:
read variable1,variable2,...variableN
[linux@zeng bin]$ cat  read_input.sh
#!/bin/bash
#
#This shell script. read you input from keyboard.
#
echo "Can you tell me what are you looking for?"
read look
echo "You are looking for $look."
[linux@zeng bin]$ read_input.sh
Can you tell me what are you looking for?
job
You are looking for job.
通配符
1、*  匹配任何字符或者字符串。
2、? 匹配单个字符。
3、[...] 匹配在其中的任何一个字符。
4、[..-..] 匹配在期间的任何一个字符。
上面的..表示字符或者数字。
先来看下当前目录下的文件有那些。
[linux@zeng bin]$ ls
math.sh  quotes.sh  read_input.sh  test01.sh  wildcard.sh
为了说明通配符,我编写了如下内容的一个脚本。
[linux@zeng bin]$ cat wildcard.sh 
#!/bin/bash
#
#This shell script. about wild card.
#
echo "Show all files in current dictionary."
ls *
echo "Find files start character m."
find . -name  m*
echo "Find files test??.sh, ? represent a character unknow."
find . -name test??.sh
echo "Find files start with string mat end up  with .sh, but a character in [abch]."
find . -name mat[abch].sh
echo "Find files start with character m end up with th.sh,but a character in a from z."
find . -name m[a-z]th.sh
[linux@zeng bin]$ wildcard.sh
Show all files in current dictionary.
math.sh  quotes.sh  read_input.sh  test01.sh  wildcard.sh
Find files start character m.
./math.sh
Find files test??.sh, ? represent a character unknow.
./test01.sh
Find files start with string mat end up  with .sh, but a character in [abch].
./math.sh
Find files start with character m end up with th.sh,but a character in a from z.
./math.sh
在shell 命令行下一次运行多个命令
语法格式:command1;command2
我这里一次运行两个命令,who i am 用来查看登录的用户的信息。
pwd 打印出当前的目录。
[linux@zeng bin]$ who i am ;pwd#用分号分隔命令。
linux    pts/1        2012-04-05 18:27 (192.168.56.1)
/home/linux/bin
注这里的 who i am 打印出来的总是最初登录系统时的用户信息。
[linux@zeng bin]$ su - root
Password: 
[root@zeng ~]# who i am
linux    pts/1        2012-04-05 18:27 (192.168.56.1)
命令行参数
命令行参数的作用:
1、用来控制命令(程序)的执行。
2、命令(程序)处理的数据的来源。
如果需要给命令或者我们的shell script. 传递参数,我们可以使用shell script. 默认的变量($0,$1...)
我们通过下面一个脚本来演示。
这个脚本的主要功能是根据用户在命令行提供的参数,进行文件的复制。
[linux@zeng bin]$ cat argument.sh 
#!/bin/bash
#
#This shell script. about command line arguments.
#
echo "Total number of command line arguments are $#"
echo "Your shell script. name is $0"
echo "First argument is $1"
echo "Second argument si $2"
cp $1 $2
echo "All argument are:$* or $@"
[linux@zeng bin]$ argument.sh /etc/inittab /home/linux/bin
Total number of command line arguments are 2
Your shell script. name is /home/linux/bin/argument.sh
First argument is /etc/inittab
Second argument si /home/linux/bin
All argument are:/etc/inittab /home/linux/bin or /etc/inittab /home/linux/bin
刚才运行脚本的时候复制过来的文件。
[linux@zeng bin]$ ll inittab
-rw-r--r--. 1 linux linux 926 Apr  5 20:08 inittab
注:
$# 表示参数的个数,这里是2.
$0 表示运行命令(程序)的名称,这里是 /home/linux/bin/argument.sh
$1 表示由命令行提供的第一个参数。
$2表示由命令行提供的第二个参数。
$N 表示由命令行提高的第N个参数。
$@与$* 表示所有的命令行参数。
数据流重定向与管道命令
在linux 中数据流分为三类:
1、标准输入(stdin),文件描述符0,使用< 或 <<.
2、标准输出(stdout), 文件描述符 1,使用> 或 >>.
3、标准错误输出(stderr), 文件描述符 2,使用 2> 或2>>.
示例:
把 ll 的输出重定向到 list.txt 文件。在这里list.txt 文件将会被自动的创建,如果该文件已经存在其中的内容会被覆盖掉。
[oracle@zeng ~]$ ll > list.txt
使用mail.txt 文件中的内容作为输入。
[oracle@zeng ~]$ mail root < mail.txt
 ~/.bash_profile 文件中添加一行。
[oracle@zeng ~]$ echo "HISTSIZE=100" >> ~/.bash_profile 
使用输出重定向把标准输出和标准错误输出分开来。
[oracle@zeng ~]$ find /home -name .bash_profile
find: `/home/linux': Permission denied
find: `/home/hello': Permission denied
/home/oracle/.bash_profile
[oracle@zeng ~]$ find /home -name .bash_profile >right.txt 2>error.txt
[oracle@zeng ~]$ cat right.txt
/home/oracle/.bash_profile
[oracle@zeng ~]$ cat error.txt
find: `/home/linux': Permission denied
find: `/home/hello': Permission denied
如果标准错误输出我们不想保存的话,可以将他从定位到 /dev/null(bit bucket,垃圾黑桶)。
[oracle@zeng ~]$ find /home -name .bash_profile >>right.txt 2>/dev/null
使用的是>>,所以append find 的输出。
[oracle@zeng ~]$ cat right.txt
/home/oracle/.bash_profile
/home/oracle/.bash_profile
标准输出重定向是不会重定向标准错误输出的。
[oracle@zeng ~]$ find /home -name .bash_profile >right.txt  
find: `/home/linux': Permission denied
find: `/home/hello': Permission denied
可以使用&> right.txt 或者使用> right.txt 2>&1来把标准输出与标准错误输出重定向到同一个文件中。
[oracle@zeng ~]$ find /home -name .bash_profile &>right.txt 
[oracle@zeng ~]$ cat right.txt
find: `/home/linux': Permission denied
find: `/home/hello': Permission denied
/home/oracle/.bash_profile
管道命令(pipe):就是把一个程序的输出作为另外一个程序的输入。语法格式如下:
命令1的标准输出作为命令2的标准输入:command1 | command2
命令1 的标准输出与标准错误输出作为命令2的标准输入:command1 2>&1 | command2
排序与计数命令
很多时候我们需要对数据进行排序,以使数据以更可读的方式呈现。或者体现出
某种规律,或者进行计数。
我编辑了如下的文本文件。
[linux@zeng bin]$ cat source.txt 
ORACLE
oracle
IBM
EMC
SISCO
HUAWEI
MICROSOFT
VMWARE
VMWARE
redhat
[linux@zeng bin]$ cat source.txt |sort
EMC
HUAWEI
IBM
MICROSOFT
oracle
ORACLE
redhat
SISCO
VMWARE
VMWARE
我在这里使用sort 进行排序,默认sort 是按照第一个字母进行排序的(从a-z,A-Z小写字母更大)。
[linux@zeng bin]$ cat source.txt |sort -r
VMWARE
VMWARE
SISCO
redhat
ORACLE
oracle
MICROSOFT
IBM
HUAWEI
EMC
使用 -r 项进行反向排序。
sort 的常用选项还有:
-f 忽略大小写
-n 使用纯数字进行排序,默认使用的是按照字符排序。
-t 域的分割。
-f 按照那个域进行排序的意思。
[linux@zeng bin]$ cat /etc/passwd | sort -t ':' -k 3 -n
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
gopher:x:13:30:gopher:/var/gopher:/sbin/nologin
ftp:x:14:50:FTP User:/var/ftp:/sbin/nologin
其中-t 指定域之间的分割符这里是 :,默认是使用Tab 分割。
-k 表示按照第三个域来进行排序,即按照uid 进行排序。
-n 表示按照数值进行排序。
怎么来报告或者消除重复的行呢?可以使用uniq 命令。
[linux@zeng bin]$ cat source.txt |sort -r|uniq
VMWARE
SISCO
redhat
ORACLE
oracle
MICROSOFT
IBM
HUAWEI
EMC
重复的行就消除了。
[linux@zeng bin]$ cat source.txt |sort -r|uniq -ic
      2 VMWARE
      1 SISCO
      1 redhat
      2 ORACLE
      1 MICROSOFT
      1 IBM
      1 HUAWEI
      1 EMC
还可以使用uniq 来做一些统计.
-i 表示忽略大小写的不同。
-c 进行出现次数的计数。
[linux@zeng bin]$ cat source.txt |sort -r|uniq -icd
      2 VMWARE
      2 ORACLE
-d 是只计数重复的行。
如果觉得sort,uniq还不够用,我们还有"厕所"wc 命令。
来看看系统中有几个用户。
[linux@zeng bin]$ cat /etc/passwd|wc -l
42
-l 表示统计行的数量,包括空行。
[linux@zeng bin]$ cat source.txt|wc -w
10
统计下有多少个单词,-w 即使word 的意思。
还可以进行统计文件bytes 的大小。
[linux@zeng bin]$ cat source.txt|wc -c
66
[linux@zeng bin]$ ll source.txt 
-rw-rw-r--. 1 linux linux 66 Apr  5 20:48 source.txt

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26110315/viewspace-720411/,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2012-02-06

  • 博文量
    169
  • 访问量
    715348