首页 > 代码库 > Bash编程基础知识学习第一节

Bash编程基础知识学习第一节

Bash编程基础知识学习

一、bash的由来

1 、什么是Bash 什么是Shell Bash 是GNU Bourne-Again SHell,是目前大多数Linux发行版采用的Shell。

Shell 是*nix提供给用户使用的界面。一个操作系统的底层是独立运行的,

用户界面和底层分开,可以最大限度的保证系统稳定。Shell就是一个特殊的程序,负责接受用户的命令,并把系统的响应返回给用户。

Bash Shell

一般不需要自己安装,在安装发行版的同时都会安装好。

Shell的存在是和登陆相关的,从用户名密码验证通过以后,Shell就启动了,知道你退出,Shell就结

束了运行。除了Bash Shell之外,还有很多其他的Shell

wps_clip_image-25544

你可在任何编程语言中使用变量,但是在脚本编程中它们是没有类型的,简称弱类型编程语言,在这个

变量中可以保含一个数字,一个字符串,一个单词等。你并不需要声明这个变量,它会在引用这个变量

时创建它。 
使用变量来实现一个简单的Hello World 
#!/bin/bash 
STR="Hello World!" 
echo $STR

二、bash特性之文件名通配(globbing):

wps_clip_image-6418

*: 任意长度的任意字符
p*d, pad, pbd, pd
*ab*c
?: 匹配任意单字符
[]: 匹配指定范围内的任意单字符
[abc], [a-z], [0-9], [0-9a-z]
[^]:匹配指定范围以外的任意单字符
[^0-9a-z]
字符集合:
[:space:] : 所有空白字符
[:punct:] : 所有标点符号
[:lower:] :所有小写字母
[:upper:] :所有大写字母
[:digit:]  :数字
[:alnum:] :数字和字母
[:alpha:] : 所有字母

三、输入输出

>>  /dev/null      cat  /path/file  <<  /somewhere/file

练习:写一脚本

1、添加10个用户:tuser601-tuser610

如果用户不存在,才添加,并以绿色显示添加成功;如果存在,则以红色显示已经有此用户;

2、显示一共添加了多少个用户;

#!/bin/bash
#
declare -i count=0
for i in {501..510}; do
if id tuser$i &> /dev/null; then
echo -e "\033[31mtuser$i\033[0m exists."
else
useradd tuser$i
echo -e "add user \033[32mtuser$i\033[0m successfully."
let count++
  fi
done
echo "Total add $count users."

文件:文件系统(内核)

标准输入:0
键盘
标准输出:1
监视器
错误输出:2
监视器
重定向意味着:
改变其标准位置
输出重定向:
COMMAND > POSITION:覆盖输出
COMMAND >> POSITION: 追加输出
错误重定向:
COMMAND 2> POSITION:覆盖输出
COMMAND 2>> POSITION: 追加输出
合并重定向:
COMMAND &> POSITION
COMMAND > POSITION 2> &1
bash的重要特性:变量

四、bash变量类别:

本地变量:只对当前shell进程有效的变量;对其它shell进程无效,包当前shell进程的子进程;

VAR_NAME=VALUE

变量赋值:向变量的存储空间保存数据

变量引用:${VAR_NAME}

wps_clip_image-9798

"":弱引用,里面的变量会被替换;

‘‘:强引用,里面的所有字符都是字面量,直接输出;

wps_clip_image-8925

环境变量:对当前shell进程及其子shell有效,对其它的shell进程无效;
定义:export VAR_NAME=VALUE
导出:export VAR_NAME
Export LANG=en 修改字体,只对当前进程有效
用户可自义环境变量
bash有许多内置的环境变量
撤消变量:unset VAR_NAME
只读变量:readonly VAR_NAME
局部变量:  local

wps_clip_image-32302

对shell脚本中某代码片断有效;通常用于函数本地;
local VAR_NAME=VALUE
位置变量:
$1, $2, ..., ${10}
特殊变量:
$?
查看当前shell进程中的所有变量:set
查看当前shell进程中的所有环境变量:export, printenv, env
登录类型:
五、脚本在电脑中执行次序
交互式:
直接通过终端输入账号和密码登录;
使用su -l USERNAME 或 su - USERNAME;
非交互式:
su USERNAME
图形界面下打开的终端
执行脚本
通过编辑配置文件修改的配置生效?
1、退出并重新登录;
2、让bash重读此配置文件;
. FILE
source FILE
交互登录的用户:
/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> 
/etc/bashrc
非交互登录的用户:
~/.bashrc --> /etc/bashrc --> /etc/profile.d/*.sh
语法高亮:
:syntax on|off
搜索高亮:
:set hlsearch
:set nohlsearch
配置文件:
全局:/etc/vimrc
用户:~/.vimrc

六、shell脚本格式:

第一行,顶格:
shebang
#!/bin/bash
#!/usr/bin/python
其它的以#开头的行均为注释,会被解释器忽略

练习:写一个脚本

1、脚本可以接受一个以上的文件路径作为参数;

2、显示每个文件所拥的行数;

3、显示本次共对多少个文件执行了行数统计;

脚本

wps_clip_image-32750

执行结果

wps_clip_image-27338

练习:写一个脚本

1、显示/etc/passwd文件中位于文件的第偶数行的用户名;并显示共有多少个这样的用户;

脚本

wps_clip_image-6223

结果

wps_clip_image-18979

七、bash当中的关键词法基础

1、数值测试条件符和字符串操作符

wps_clip_image-14189

2、字符串测试

wps_clip_image-4463

3、逻辑与或运算

-a 与  -o 或  ! 非  、   &&   且   ||   且  前面执行完了,执行
后面的,前面错误后面就不执行啦。
组合条件测试:在多个条件间实现逻辑运算
与:[ condition1 -a condition2 ]
condition1 && condition2
或:[ condition1 -o condition2 ]
condition1 || condition2
非:[ -not condition ]
! condition

wps_clip_image-24372

wps_clip_image-24117

练习:提示用户输入一个用户名,如果用户存在,就显示用户的ID号和shell;否则显示用户不

存在;  显示完成之后不退出,再次重复前面的操作,直到用户输入q或quit为止;

 

read -p "Plz enter a username: " userName
  while [ "$userName" != ‘q‘ -a "$userName" != ‘quit‘ ]; do
  if id $userName &> /dev/null; then
      grep "^$userName\>" /etc/passwd | cut -d: -f3,7
  else
  echo "No such user."
  fi
  read -p "Plz enter a username again: " userName
  Done

练习:求100以内所有偶数之和;要求使用取模方法;

#!/bin/bash
declare -i counter=1
declare -i sum=0
while [ $counter -le 100 ]; do
    if [ $[$counter%2] -eq 0 ]; then
        let sum+=$counter
    fi
    let counter++
done
echo $sum

2、文件测试:

-e 文件名:如果文件存在则为真
-r 文件名:如果文件存在且可读则为真
-w 文件名:如果文件存在且可写则为真
-x 文件名:如果文件存在且可执行则为真
-s 文件名:如果文件存在且至少有一个字符则为真
-d 文件名:如果文件存在且为目录则为真
-f 文件名:如果文件存在且为普通文件则为真
-c 文件名:如果文件存在且为字符型特殊文件则为真
-b 文件名:如果文件存在且为块特殊文件则为真

wps_clip_image-30006

练习:写一个脚本,完成如下任务:

1、分别复制/var/log下的文件至/tmp/logs/目录中;
2、复制目录时,才使用cp -r
3、复制文件时,使用cp
4、复制链接文件,使用cp -d
5、余下的类型,使用cp -a
if [ -d $1 ];then
cp -r /var/log/$1 /tmp/logs
elif [ -d $1 ];then
cp -r /var/log/$1 /tmp/logs
if [ -f $1 ];then
cp  /var/log/$1 /tmp/logs
else
cp -a /var/log/$1 /tmp/logs
fi

wps_clip_image-19798