您的位置:首页 > 运维架构 > Shell

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

2014-08-03 14:11 330 查看
Bash编程基础知识学习
一、bash的由来
1 、什么是Bash 什么是Shell Bash 是GNU Bourne-Again SHell,是目前大多数Linux发行版采用的Shell。
Shell 是*nix提供给用户使用的界面。一个操作系统的底层是独立运行的,
用户界面和底层分开,可以最大限度的保证系统稳定。Shell就是一个特殊的程序,负责接受用户的命令,并把系统的响应返回给用户。
Bash Shell
一般不需要自己安装,在安装发行版的同时都会安装好。
Shell的存在是和登陆相关的,从用户名密码验证通过以后,Shell就启动了,知道你退出,Shell就结
束了运行。除了Bash Shell之外,还有很多其他的Shell



你可在任何编程语言中使用变量,但是在脚本编程中它们是没有类型的,简称弱类型编程语言,在这个
变量中可以保含一个数字,一个字符串,一个单词等。你并不需要声明这个变量,它会在引用这个变量
时创建它。
使用变量来实现一个简单的Hello World
#!/bin/bash
STR="Hello World!"
echo $STR
二、bash特性之文件名通配(globbing):



*: 任意长度的任意字符
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}



"":弱引用,里面的变量会被替换;
'':强引用,里面的所有字符都是字面量,直接输出;



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



对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、显示本次共对多少个文件执行了行数统计;
脚本



执行结果



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



结果



七、bash当中的关键词法基础
1、数值测试条件符和字符串操作符



2、字符串测试



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






练习:提示用户输入一个用户名,如果用户存在,就显示用户的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 文件名:如果文件存在且为块特殊文件则为真



练习:写一个脚本,完成如下任务:
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


内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息