Shell编程常用代码实例教程


原文地址: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放弃所有权,交给用户进行交互,没有这一行没法继续用了。



  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值