Shell编程常用代码实例教程

转载 2015年07月07日 17:26:15


原文地址:http://erex.sinaapp.com/category/shell/


本文是在Fedora 13的环境下进行编写测试的,使用的是默认的shell,名字是GNU bash,版本号4.1.2。

告诉系统使用哪一个Shell

?View Code BASH
#!/bin/sh

上面的代码告诉系统使用的Shell是位于bin目录里面的sh,实际上sh链接到bin目录下的bash文件,也就是说我们使用的Shell是bash。

注释一行代码

?View Code BASH
# comment

C语言可以使用“//”来注释一行代码,在Shell编程中,符号“#”有同样的作用,以上代码中的comment不会被执行。

调用命令

?View Code BASH
rm -f "a.gif"

和在控制台输入命令一样,直接输入代码即可。

变量的赋值

?View Code BASH
a=123
b="abc"
c=3.14

Shell编程里面的变量不需要声明,直接赋值即可,支持整数和串两种类型。

变量的运算

?View Code BASH
a=3
b=4
c=$((a*b))

“$(())”能够实现简单的变量运算,只支持整数,在Shell编程中,浮点数只能作为串进行处理,不能直接进行运算。

数组

?View Code BASH
arr=(tiger sheep wolf)
amimal=${arr[1]}
arr[2]="monkey"

以上数组定义了3个元素“tiger”“sheep”和“monkey”。通过“${}”符号可以取出数组的元素,数组的索引从0开始,所以第二行代码取出的值为“sheep”。第三行代码将修改数组的第三个元素为“monkey”。

逻辑判定

?View Code BASH
test -f "a.gif"
[ -f "a.gif" ]

以上代码都是判断a.gif这个文件是否存在,其中“[”看起来是个符号,实际上链接到“test”这个命令,其中的“-f”属于判断文件条件的参数,意思是判断这个文件是否存在。直接执行以上代码将看不到任何返回信息,因为逻辑判断需要和if或者while之类的语句联合使用。关于逻辑判定的参数有很多,比如比较大小的小于“-lt”、小于或等于“-le”等等,执行“man test”命令即可看到,这里不再累述。

if语句

?View Code BASH
bool=1
if [ $bool = 1 ]; then
echo "Hello Shell!"
else
echo "This message won't show up."
fi

以上代码先给变量“bool”赋值为1,然后判断它是不是等于1,等于则显示“Hello Shell!”,否则显示“else”关键字后面的信息。这里由于已经确定“bool”是1,所以“else”关键字后面的输出不会显示出来。

while语句

?View Code BASH
n=7
i=0
while [ $i -lt $n ]
do
echo $i
i=$((i+1))
done

设定变量“n”为7,使用一个循环进行判断,当变量“i”小于“n”的时候循环继续,执行这段代码将输出0到7的整数。

文件读取与写入

?View Code BASH
tmp_file=./tmp.txt
while read -r file_line
do
echo $file_line >> ./out.txt
done < $tmp_file

从“./tmp.txt”文件里面读取每一行放到“file_line”变量里面,然后输出追加到“./out.txt”这个文件。“>>”表示的是追加到文件末尾,“>”表示直接覆盖文件。
如果文件有n行,没一行固定有3个元素,那么可以用下面的代码来读取,这样,每行的3个元素都会分别自动存入到“a”“b”“c”3个变量。

?View Code BASH
while read -r a b c
do
echo $a $b $c
done < $tmp_file

替换变量中的字符串

?View Code BASH
str=xxxleftxxx
str=${str/left/right}

以上代码把变量“str”里面的子串“left”替换为“right”,不过只能替换第一个出现的串。“${}”符号在字串处理方面的用处还有很多,有兴趣可以自行查阅相关资料。

替换文件中的字符串

?View Code BASH
sed -i "s/left/right/g" ./a.txt

这个将把“./a.txt”文件里面的所有“left”替换成“right”。

连接字符串

?View Code BASH
a=111
b=222
c=$a$b

连接字符串简单的把变量写在一起即可,如果中间要加空格,可以用转义字符写成如下形式。

?View Code BASH
c=$a\ $b

在文件中查找字串

?View Code BASH
grep "apple" "./news.txt"
grep "apple" -A 3 -B 4 "./news.txt"

第一行代码将在“./news.txt”文件中查找包含字串“apple”的行,并现实出来,第二行代码的区别在于它将同时显示出包含字串“apple”的行的前4行和后3行。grep的用法还有很多,可以使用man查看。

将返回输出保存到变量

?View Code BASH
str=`grep "apple" "./news.txt"`

“./news.txt”文件中保存有字串“apple”的行将都被存入“str”变量里面,注意到,这个等号后面的命令是被符号“`”括起来的,这个符号在键盘“1”的左边,“Esc”的下面。

管道重定向

?View Code BASH
echo $vswr|awk '{printf("%lf", sqrt($1))}'

“|”这个符号把前面的命令的输出作为后面命令的输入,这样可以简化中间的存取操作步骤。不过需要注意的是,由于重定向需要folk出新进程,所以在“|”之后的代码是无法修改之前代码中的变量的值的,如果需要修改,最好把输出存到一个临时文件,再作为后面命令的输入。

获取文件指定行

?View Code BASH
sed -n '4p' "./news.txt"

获取文件的第4行。sed的用法还有很多,可以用man查看。

获取一行文本的指定列

?View Code BASH
a="aa bb cc"
echo $a|awk '{print $1}'

结果将输出第一列元素“aa”,由于“$0”将输出整个串,所以索引是从1开始的。

浮点数计算

?View Code BASH
pi=3.1415926
r=2
area=`awk 'BEGIN{printf("%lf", '$pi'*'$r'*'$r')}'`

awk是个非常强大的命令,其中支持对C语言的模拟就为Shell编程增色不少。除了以上这种方法,还可以使用计算器bc进行计算。

?View Code BASH
area=`echo "$pi*$r*$r" | bc -l`

关于浮点计算有些问题需要注意,由于在输入数据的时候只是简单的使用类似于C语言的宏替换,所以在减一个负数的时候回报错,类似于“–”这样连续两个减号是不允许的,所以最好用括号把变量括起来。另外bc不支持科学计数法,如果浮点数里面有E,它会报错。



bash统计文件中出现频率最高的单词的次数

2013年12月10日Rex评论已被关闭
?View Code BASH
#!/bin/bash
 
if [ -z $1 ]; then
    echo "No input file!"
    exit
else
    filename=$1
fi
 
sed 's/ /\n/g' "$filename" | sort | uniq -c | sort -rn | sed 10q
分类:Shell标签:

bash统计源码行数

2013年12月10日Rex评论已被关闭
?View Code BASH
#!/bin/bash
 
postfix=".c"
 
if [ -z $1 ]; then
    directory=$PWD
else
    directory=$1
fi
 
c=0
 
function linecount {
    local files=(`ls "$1"`)
    for file in ${files[@]}; do
        local filepath=$1/$file
        if [ -d $filepath ]; then
            linecount $filepath
        elif [ -f $filepath -a $postfix = ${file:$((${#file}-${#postfix}))} ]; then
            local filelinecount=(`wc -l "$filepath"`)
            c=$(($c+${filelinecount[0]}))
        fi
    done
}
 
linecount $directory
echo $c
分类:Shell标签:

使用grep判断文件中是否存在某个字符串

2012年6月4日Rex评论已被关闭
?View Code BASH
1
2
3
4
5
6
ret=`grep -c $str $filename`
if [ $ret -eq 0 ]; then
    echo no
else
    echo yes
fi

grep使用-c可以返回字符串在目标文件中出现的行数,不存在则返回0

分类:Shell标签:

使用expect自动登陆SSH

2011年12月22日Rex评论已被关闭

这是一个偷懒的方法,密码将直接保存在登陆脚本中,非安全。

?View Code BASH
1
2
3
4
5
6
7
8
9
#!/usr/bin/expect
 
#auto ssh login
spawn ssh -l username hostname
expect "password:"
send "password"
expect "]$ "
send "cd Download\r"
interact

使用这个脚本首先需要确定安装了expect,如果没有,开启root权限,Fedora下面可以输入下面的命令下载安装。

?View Code BASH
1
yum install expect

spawn后面跟要执行的命令,expect表示期望收到的回显的字符串,如果匹配,则继续执行后文中send命令,发送要输入的内容。
ssh登陆通常显示“password:”就停下来等用户输入了,这时候使用send发送密码即可。
interact表示expect放弃所有权,交给用户进行交互,没有这一行没法继续用了。



本人网上收集整理的shell教程,非常详细

Shell简介:什么是Shell,Shell命令的两种执行方式 Shell本身是一个用C语言编写的程序,它是用户使用Unix/Linux的桥梁,用户的大部分工作都是通过Shell完成的。Shell既...
  • u012865381
  • u012865381
  • 2016年09月10日 22:24
  • 3193

SHELL入门教程(7)-编写脚本

执行脚本 位置参数 exit [[..]] 控制命令 输入输出命令 其他
  • justkk
  • justkk
  • 2015年07月23日 17:18
  • 1611

shell编程简明教程

shell编程 1. 什么是shell? 用户登录Linux后,就会出现一个系统提示符号,可以在符号后输入一大堆命令,并获得预期效果,到底幕后是谁在帮我们处理这一大堆事情呢?就是Shell...
  • gz153016
  • gz153016
  • 2016年04月08日 18:08
  • 371

C Shell教程(打包下载)

C Shell教程,Very Good!!!http://chifeng.cosoft.org.cn/downloads/cshell.rar2004/09/30
  • chifeng
  • chifeng
  • 2004年09月30日 14:18
  • 2705

56个 PHP 开发常用代码片段

 2016/02/14  在编写代码的时候有个神奇的工具总是好的!下面这里收集了 50+ PHP 代码片段,可以帮助你开发 PHP 项目。 这些 PHP 片段对于 PHP 初学者也...
  • dj0379
  • dj0379
  • 2016年11月08日 15:43
  • 913

常用web代码

1.oncontextmenu="window.event.returnvalue=false"将彻底屏蔽鼠标右键no可用于Table 2.取消选取、防止复制3.onpaste="returnfals...
  • cxyyxc
  • cxyyxc
  • 2007年08月04日 09:28
  • 480

精通linux shell编程教程pdf完整版.pdf

  • 2016年04月28日 11:09
  • 2.68MB
  • 下载

Linux Shell编程(基础教程)

转载:http://bbs.bitscn.com/thread-72875-1-1.html 1. Linux 脚本编写基础 1.1 语法基本介绍 1.1.1 开头        程序必须...
  • mafuli007
  • mafuli007
  • 2014年06月10日 10:24
  • 2138

Linux常用命令代码大全

系统信息: arch 显示机器的处理器架构(1) uname -m 显示机器的处理器架构(2) uname -r 显示正在使用的内核版本 dmidecode -q 显示硬件系统...
  • a249130
  • a249130
  • 2017年09月14日 08:43
  • 172

EXCEL VBA常用代码集

1.显示活动工作簿名称 MsgBox "当前活动工作簿是 " & ActiveWorkbook.Name 2.保存活动工作簿 Activeworkbook.Save 3.保存所有打开...
  • xploverain
  • xploverain
  • 2017年01月12日 10:49
  • 574
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Shell编程常用代码实例教程
举报原因:
原因补充:

(最多只允许输入30个字)