LINUX学习—bash编程

Bash特性

进程:在每个进程看来,当前主机上只存在内核和当前进程;
进程是程序的副本,进程是程序执行的实例

bash特性:
1、命令历史,命令补全;
2、支持管道、重定向;
3、支持命令别名alias;
4、支持命令行编辑;
5、支持命令行展开;
6、支持文件名通配;
7、支持使用变量;
8、支持编程;
。。。

命令行编辑:
光标跳转:
ctrl+A:跳到行首;
Ctrl+E:跳至行尾;
Ctrl+k:删除光标至命令行尾的内容;
Ctrl+u:删除光标至行首的内容
Ctrl+l:清屏;

命令历史:
history:查看命令历史

    -c:清空命令整个历史
    -d OFFSET [n]:删除指定位置的命令 history -d 2010 10(表示删除2010后位置10个历史命令)
    -w:保存命令历史至历史文件中

命令历史相应保存在家目录的.bash_history或.zsh_history隐藏文件中
环境变量
PATH:命令搜索路径
HISTSIZE:命令历史缓存区大小

命令历史的使用技巧

    !n:执行命令历史中的第n条命令  
    !-n:执行命令历史中倒数第n条命令  
    !!:执行上一条命令;  
    !string:执行命令历史中最近一个以指定字符串开头的命令  
    !$:引用前一个命令的最后一个参数;  
    ESC, .(按ESC后松开再按.号):引用前一个命令的最后一个参数;  
    ALT+.:引用前一个命令的最后一个参数;  
    TAB:命令补全/路径补全  

路径补全:tab键

命令别名:
alias CMD=’COMMAND [OPTION] [ARGUMENT]’ (有空格需要用单引号括起来)
在shell中定义的别名仅在shell的生命周期中有效:别名有效范围为当前shell进程;要做到永久有效时需要写到配置文件中;
unalias CMD:撤销命令别名

命令替换:
把命令中某个子命令替换为其执行结果的过程;
$(COMMAND) 或COMMAND (注意是反引号): 对命令进行替换
touch ./ $(date +%F-%H-%M-%S).txt

bash支持的引号:
“(反引号):命令替换
“ “(双引号):弱引用,可以实现变量替换
‘ ’(单引号):强引用,不完成变量替换

文件名通配, globbing(其实是命令展开,相当于文件名展开)

    *:可以用于实现任意长度任意字符 
    ?:匹配任意单个字符 ls ?e 
    [ ]:匹配指定范围内的任意单个字符 [abc], [a-m]表示a-m中任何一个, [a-zA-Z]  
    [^]:取反,非范围内  
    ls [a-zA-Z]*[0-9]:以字符开头,以数字结尾的任意文件  
    [:space:]:所以的空格(使用时还需在外面在加一个中括号) 
    [:punct:]:标点符号  
    [:lower:]:小写字母  
    [:upper:]:大写字母  
    [:alpha:]:大小写字母  
    [:digit:]:数字   
    [:alnum:]:数字和大小写字母  
    加个^表示取反,如[^[:alpha:]]表示非字母  
    ls [[:alpha:]]*[[:digit:]]  

通配符有些问题并不能精确描述,导致不能匹配,此时需要用正则表达式;

man 7 glob 可查看以上文件名通配的说明;

基础知识

bash变量的类型:
本地变量(局部变量)
环境变量(当前shell进程及其子进程)
位置变量:$1,$2,....
shift:轮换,轮替,前一个位置变量shift后可重复适用,shift(shift1)命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1),而变量值提前一位。同理,shift n后,前n位参数都会被销毁。
特殊变量 :
退 1. 2. 0 255 0 1 255 1 2 , 127 #:参数的个数
@:参数列表(二者有所不同)
注意:
输出重定向的常用技巧:
/dev/null:软件设备,为一个数据黑洞,一旦输出到这则不会输出
例:检验是否存在以student为名的用户
id student &>/dev/null
echo ? 0 ,因为撤销的是变量本身而不是变量值
unset VARNAME
查看当shell中变量:不带任何选项和参数,包括环境变量和本地变量
set
查看当前shell中的环境变量
printenv
env
export

在已有变量上添加变量:(如添加环境变量)
- #在环境变量后面添加变量
export PATH=$PATH:/usr/local/apache/bin
- #在环境变量前面添加变量
export PATH=/usr/local/apache/bin:$PATH
脚本:命令的堆砌,按实际需要,结合命令流程控制机制实现的源程序

#!/bin/bash
#注释行,不执行
条件判断
如果用户不存在  
    添加用户,给密码并显示添加成功;   
否则  
    显示如果已经存在,没有添加;   

bash中如何实现条件判断?

一、条件测试类型:

1. 整数比较(整数测试):
-eq:测试两个整数是否相等:比如 A e q B
-ne:测试两个整数是否不等:不等真,相等为假
-gt:测试一个数是否大于一个数,大于为真,否则为假
-lt:测试一个数是否小于一个数,小于为真,否则为假
-ge:大于或等于
-le:小于或等于
2. 字符串比较(字符测试):
==(=):测试是否相等,相等即为真(等号两端需要空格才能比较)[ ‘ A = B’ ]
!=:测试是否为假, 不等则为真,相等为假;
>
<(大于及小于在字符串测试中应用较少)
-n string:测试指定字符串是为空,空则真,不空则假;
-z string:测试指定字符串是否不空,不空为真,空则为加;
3. 文件测试: 判断文件是否存在
-e FILE:测试文件是否存在(即表示存在为真,不存在为假,下同)
-f FILE:测试文件是否为普通文件
-d FILE:测定指定路径是否为目录
-r FILE:测试当前用户对指定文件是否有读取权限
-w FILE:测试当前用户对指定文件是否有可写权限
-x FILE: 测试当前用户对指定文件是否有可执行权限
[ -e /etc/inittab ]
4. 条件测试的表达式:
- [ expression ](注意空格)
- [[ expression ]]
- test expression
5. 组合测试条件:
-a:与关系
-o:或关系
-i:取反,非关系
if [ $# -gt 1 -a $# -le 3 ] 或者 if [ $# -gt 1 ] && [ $# -le 3 ]
6. 命令间的逻辑关系:
逻辑与:&&
如果第一个条件为假时,第二条件不用再判断,最终结果已有:
第一个条件为真时,第二个条件必须判断;
逻辑或:||
如果第一个条件为真,第二个条件不用判断,最终结果已有;
如果第一个条件为假,第二个条件必须判断才能知晓最终结果;
如果用户user6不存在,就添加用户user6
! id user6 && useradd user6(表示如果用户不存在就添加)
id user6 || useradd user6 (表示如果用户不存在就添加)
如果用户存在,就显示用户已存在,否则,就添加此用户:
id user1 && echo "user1 exists" || useradd user1
如果用户不存在,就添加,否则,显示其已经存在
!id user1 && useradd user1 || echo "user1 exists."
如果用户不存在,添加并且给密码:否则,显示其已存在
!id user1 && useradd user1 && echo "user1" | passwd --stdin user1 || echo "user1 exists"
7. SHELL中如何进行算术运算;
A=3
B=6
1. let 算术运算表达式
let C= A + B
2. [ ] C = [ A + B]
3. ( ( ) ) C = (( A + B))
4. expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
C= expr $A + $B
exit:退出脚本
exit num(数字)

二、条件判断,控制结构:

1)if判断语句

1. 单分支if语句
if 判断条件;then
statement1
statement2

fi

2. 双分支if语句:
if 判断条件;then
statement1
statement2

else
statement3
statement4

fi

3. 多分支的if语句:
if 判断条件1;then
statement1

elif 判断条件2;then
statement2

elif 判断条件3;then
statement3

else
statement4

fi

给定一个路径,判断是否存在,存在显示存在,否则显示其不存在

变量名称:
1、只能包含字母、数字下划线,并且不能数字开头;
2、不应该跟系统中已有的环境变量重名,否则会覆盖值;
3、最好做到见名知义;

测试脚本是否有语法错误
bash -n 脚本名称
bash -x 脚本:单步执行 (可检查每一步执行正确与否)

exit:退出脚本
exit #
如果脚本没有明确定义退出状态码,那么,最后执行的命令的退出码即为脚本的退出状态码:

循环:进入条件,退出条件
2)for while循环:适用于循环次数未知的场景,要有退出条件
语法:
1. while循环
while CONDITION; do
statement

done

2. for循环
for 变量 in 列表; do(如果do单行写的话不需要加分号,与if中then类似)
循环体

done
当列表被遍历完成之后,退出

练习:计算100以内所有正整数的和

#!/bin/bash
#
declare -i sum=0
declare -i I=1
while [ $I -le 100 ]:do
let sum+=$I
let I++
done
echo $sum

3. case语句
case语句:选择结构

    case SWITCH in
    value1)
    statement
    ...
    ;;(每个语句都必须用双分号结尾)
    value2)
    statement
    ...
    ;;
    *)
    statement
    ...
    ;;
    esac(结束)

如何生成列表
整数列表 {1..100}
seq [起始数] [步进长度] 结束数
declare -i SUM=0 #声明SUM为整型
-i :integer
-x=export(环境变量)

#计算从1加到100   
declare -i sum=0
for i in {1..100};do
        let sum=`$($sum+$i)`
done
echo "the sum is $sum

写一个脚本:
1、设定变量FILE的值为/etc/passwd
2、依次向/etc/passwd中的每个用户问好,并显示对方的shell,形如:Hello, root, your shell :/bin/bash
3、统计一共有多少个用户
for I in seq 1 $LINES;do echo “Hello, head -n $I /etc/passwd |tail -1 |cut -d: -f1” done
扩展:只向默认shell为bash的用户问好

取模,取余:%

猜你喜欢

转载自blog.csdn.net/ihblxh/article/details/81980245
今日推荐