工学1号馆

home

Shell脚本编程1--入门

By Wu Yudong on November 16, 2016

一个简单的脚本

wu@ubuntu:~$ who
wu       :0           2016-11-12 08:03 (:0)
wu       pts/7        2016-11-13 00:42 (:0)

如果系统用户很多,这时候使用wc -l统计用户数:

wu@ubuntu:~$ who | wc -l
2

| (管道)符号可以在两个程序之间建立管道,who的输出成为wc的输入,wc列出的结果就是已登录的用户数量

将此管道转变成一个独立的命令,然后放在一个文件,最后使用chmod为该文件设置执行的权限,如下:
wu@ubuntu:~$ cat > test
who | wc -l
^D
wu@ubuntu:~$ chmod +x test
wu@ubuntu:~$ ./test
2

开发小型shell脚本的开发周期小结:

直接在命令行测试,一旦找到能够完成工作的语法,再将它们放进一个独立的脚本里面,再为该脚本设置执行权限,之后就能直接使用该脚本。

最典型的shell脚本开头:#! /bin/sh

本文地址:http://wuyudong.com/2016/11/16/3042.html,转载请注明出处。

Shell的基本元素

1、命令与参数

举个例子:

wu@ubuntu:~$ cd ~/opt/Cproject ; ls -l test.c
-rw-rw-r-- 1 wu wu 278 Oct 21 04:14 test.c

使用空格隔开各个组成部分,命令名称在最前面,后面跟着选项,额外的参数放在选项后,选项的开头是一个破折号,可能需要加上参数,例如:gcc test.c -o test。分号被用来分隔同一行的多条命令,shell会依次执行这些命令

2、变量

变量就是为某个信息片段所起的名字,变量的长度没有限制,变量赋值的方式如下:

变量名=值,之间没有空格,取变量的时候在变量名前面加上$,单行 可以多次赋值,当所赋之值含空格的时候,加上双引号,例如:

a1=a  a2=b  a3=c
full="a b c"
d=$full

3、简单的echo输出

echo的命令就是为了产生输出

wu@ubuntu:~$ echo wu yu dong
wu yu dong
wu@ubuntu:~$ echo "Enter your name: "
Enter you name:
wu@ubuntu:~$ echo -n "Enter your name: "
Enter your name: wu@ubuntu:~$

加上参数-n表示会忽略结尾的换行符号,关于转义命令很多,需要使用的时候可以到网上查找

echo在版本上的差异,导致Unix版本间可移植性问题

4、printf输出

printf命令几乎复制了C语言该函数的所有的功能

wu@ubuntu:~$ printf "wu yu dong\n"
wu yu dong

5、基本的I/O重定向

默认的标准输入、标准输出以及标准错误输出都是终端,通过cat得知:

wu@ubuntu:~$ cat
wuyudong
wuyudong
hello
hello
good
good
^D

Shell提供了几种改变默认I/O来源端与目的端的语法标记

重定向与管道

以 < 改变标准输入

program < file可将program的标准输入改为file:

tr -d '\r' < dos-file.txt ...

以 > 改变标准出

program > file可将program的标准输出改为file:

tr -d '\r' < dos-file.txt > unix-file.txt

注意:如果目标文件不存在,则新建一个,如果存在则覆盖

以  >> 附加到文件

program >> file 可将program的标准输出附加到 file的结尾处:

for f in dos-file.xt
do
    tr -d '\r' < $f >> big-unix-file.txt
done

注意:如果目标文件不存在,则新建一个

以 | 建立管道

program1 | program2 可将program1的标准输出修改为program2的标准输入:

管道可以把两个以上的程序衔接在一起,管道可以使得执行速度比用临时文件的程序快上10倍,通过管道可以构建复杂的程序,比如:

tr -d '\r' < dos-file.xt | sort > unix-file.txt

6、基本命令查找

shell会沿着查找路径$PATH来寻找命令,$PATH是一个以冒号分隔的目录列表,可以在列表指定的目录下找到所要执行的命令。所找到的命令可能是编译后的可执行文件,也可能是shell脚本,从用户的角度并无不同。

wu@ubuntu:~$ echo $PATH
/home/wu/opt/apache-maven-3.0.4/bin:/home/wu/opt/apache-ant-1.8.3/bin:/home/wu/opt/jdk1.6.0_37/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games:/usr/local/games:/home/wu/opt/hbase-0.92.1/bin

名称为bin的目录用来保存可执行文件,如果你要编写自己的脚本,可以准备一个自己的bin目录,并且让shell能够自动找到它们:
wu@ubuntu:~$ cat > test.sh
#! /bin/sh
who | wc -l
wu@ubuntu:~$ chmod +x test.sh
wu@ubuntu:~$ cd
wu@ubuntu:~$ mkdir bin
wu@ubuntu:~$ mv test.sh bin
wu@ubuntu:~$ PATH=$PATH:$HOME/bin
wu@ubuntu:~$ test.sh
2

PATH的设置是临时有效的,重启计算机后就会失效,要想永久生效,在/etc/profile里面使用root权限添加:

PATH=$PATH:$HOME/bin

重启电脑即可生效

 

如果文章对您有帮助,欢迎点击下方按钮打赏作者

Comments

No comments yet.
To verify that you are human, please fill in "七"(required)