首页 > 代码库 > 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
你可在任何编程语言中使用变量,但是在脚本编程中它们是没有类型的,简称弱类型编程语言,在这个
变量中可以保含一个数字,一个字符串,一个单词等。你并不需要声明这个变量,它会在引用这个变量
时创建它。
使用变量来实现一个简单的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