首页 > 代码库 > shell基础学习

shell基础学习

 

Bash脚本基础

BASH = GNU Bourne-Again Shell,BASH 是 GNU 组织开发和推广的一个项目。

Bash脚本类似批处理,简单来讲就是把许多的指令集合在一起,并提供循环、

条件、判断等重要功能,语法简单实用,用以编写程序,大大简化管理员的操

作,并可以完成图形工具所无法实现的功能。

 

如何创建新shell脚本?

1. 创建包含bash命令的文本文件。文件的第一行应为:

#!/bin/bash

2. 使文件可执行(使用chmod +x scripts)

3. 将文件放置在用户的$PATH的目录中

~/bin – 用于用户的私有程序

/usr/local/bin – 本地开发、系统上的其他人使用的脚本

/usr/local/sbin - 本地开发、由root使用的脚本

直接运行脚本和使用source命令运行脚本是不同的!

脚本调试模式:

#!/bin/bash-x

# bash -xscripts

技术分享

调试脚本:#!/usr/bin/env tcsh -x(/usr/bin/env 带你去找tcsh)

export (环境变量)

用户变量:vim .bash_profile

export a=1


技术分享

技术分享

系统变量:vim /etc/profile

技术分享

source /etc/profile

 

export a=5

(系统级别比用户级别高)

技术分享

引用和转义

引用和转义在shell解析字符串时用于去除字符串中特殊字符或保留词语的特殊含义。这会导致按字

面处理字符串,而不是展开变量或将其部分内容视作具有特殊含义。

引用有三种类型:

 

弱引用

将字符串放置在双引号中,保留字符串中所有字符的文字值,$、`、\和!字符除外。换言之,变量

扩展和命令扩展在双引号内仍起作用。


技术分享

技术分享

强引用

将字符串放置在单引号中,保留字符串中所有字符的文字值,同时禁用所有扩展:


技术分享

技术分享

转义

非引用的\是转义字符。它保留了下一个字符的文字值。(例如,\$PATH是确切的字符串$PATH,而

不是PATH变量的内容。)

技术分享

 

Shell变量

shell变量用于为稍后在脚本中使用的名称指定值,并且仅限于shell命令行或从中声明变

量的脚本。

 

技术分享

 

Shell运算符

<VARIABLE>++ 增量后

<VARIABLE>-- 减量后

- 减法

+ 加法

** 幂运算

* 乘法

/ 除法

% 余数

+= 加等

-= 减等

 

Shell计算命令:

$[]表示数学运算

# echo $[1+2]

# a=1; echo $[$[$a+1]*2]

expr表示数学运算。

# echo `expr 1 + 2`

let指示数学运算。

# let A=1+2

# echo $A

 

shell小练习:技术分享

10s倒计时:

#!/bin/bash

for ((SEC=10;SEC>0;SEC--))

do

echo -ne " After ${SEC}s is end "(-n 不换行)

echo -ne "\r      \r" (刷新)

sleep 1 (睡眠1s)

done

 

1min10s倒计时:技术分享

#!/bin/bash

MIN=1

for ((SEC=10;SEC>0;SEC--))

do

echo -ne  "After${MIN}:${SEC}s is end "

sleep 1

echo -ne "\r     \r"

 

      while [ "$SEC"-le "0" -a "$MIN" -gt "0" ]

      do

      echo -ne "After${MIN}:${SEC}s is end"

      echo -ne "\r        \r"

      ((MIN--))

      SEC=10

      done

done

 

数据库的备份:技术分享

#!/bin/bash

for DB in $(mysql -uroot -predhat -e "show databases;" -E-N | grep -v ‘^*‘| grep -v ‘schema$‘)

do

mysqldump -uroot -predhat $DB>/mnt/$DB.dump

done

 

测试主机之间能否ping通:技术分享

#!/bin/bash

ping -c1 -w1 $* &> /dev/null && echo $* is up || echo$* is down

while [ -z "$*" ]

do

echo "Please into a ip"

break

done

 

创建用户和给用户设定密码:技术分享

#!/bin/bash

read -p "Please input you want add a user: " user

useradd $user

passwd $user

 

 

退出状态:

linux命令完成时,将返回退出状态。成功完成程序时,将返回0的推出状态。这被bash

当作逻辑True值。非零退出状态通常表示发生了错误,并且被bash当作逻辑False值。

例如:grep的退出状态的含义:

0 – 在指定的文件中找到了模式

1 – 在指定的文件中未找到模式

>1 – 一些其他错误(无法打开文件、错误的搜索表达式等)

 

 

test条件判断

test命令可用于评估bash脚本中的表达式。它评估其参数所指定的表达式,如果表达式

为true,返回零退出状态,如果表达式为false,则返回非零退出状态。test具有替代语

法,使用方括号"[]"将表达式括起来,这样更易于阅读。

语法:test EXPRESSION 或 [EXPRESSION]

非零或零长度字符串运算符:test -{n|z} STRING

 

二进制文件运算符:-ef(节点号是否相同)、-nt(时间戳谁更新)、-ot(谁的时间戳更老)

[root@server0 bin]# [ /bin/mount -ef /usr/bin/mount]; echo $?

0

[root@server0 bin]# [ /bin/mount -nt /usr/bin/mount]; echo $?

1

[root@server0 bin]# [ /bin/mount -ot /usr/bin/mount]; echo $?

1

 

脚本小练习:输入一个数,判断是否是0~10技术分享

 

#!/bin/bash

read -p "please into a number:"n (外部传递参数)

[ $n -ge 0 -a $n -le 10 ] && echo"ok!" || echo "no!"

-ge (大于等于)  -le(小于等于)

-eq (等于) -ne(不等于)

-lt (小于) -gt (大于)

 

 

if语句

if命令检查if后面的命令或列表的退出值。如果第一个命令评估为true/零,则运行then

之后的命令列表,直至任一else。如果第一个命令评估为false/非零,则运行else与fi之

间的命令列表(反向平写if,标记if块的结束)。

语法:if command; then command;command2; else command3; fi

 

shell小练习:判断文件的类型技术分享

#!/bin/bash

if [ -z "$1" ]

then

echo "Please input filename!"

else

[ -b "$1" ] && echo block

[ -c "$1" ] && echo cfile

[ -f "$1" -a ! -L "$1" ] && echo file

[ -d "$1" ] && echo document

[ -L "$1" ] && echo soft-linkfile

[ ! -e "$1" ] && echo $1 is not exist

fi

 

 

 

case语句

case语句 :它能够把变量的内容与多个模板进行匹配,再根据成功匹配的模板去决定应该执行哪部分代码。

 

shell小练习: 技术分享

#!/bin/bash

case "$1" in

     apple) echo banana

;;

     banana)echo apple

;;

       *)echo error!

;;

esac

 

 

 

expect语句:

在shell中利用expect实现自动应答脚本

 

shell小练习:ssh技术分享

#!/usr/bin/expect

set IP [lindex $argv 0]

set PASS [lindex $argv 1]

spawn ssh root@$IP

      expect {

            "yes/no"

            {send"yes\r";exp_continue}

           "password:"

            {send"$PASS\r"}

            }

interact

 

 多加练习才能熟练掌握哦~技术分享

 

 

 

 

 


shell基础学习