bash shell

bash的配置文件:

全局配置

/etc/profile , /etc/profile.d/*.sh , /etc/bashrc

个人配置

`/.bash_profile , `/.bashrc

profile类的文件:
  设定环境变量
  运行命令或脚本

bashrc类的文件 :
  设定本地变量
  定义命令别名

登录式shell如何读取配置文件?

/etc/profile --> /etc/profile.d/*.sh --> ~/.bash_profile --> ~/.bashrc --> /etc/bashrc

非登录式shell如何配置文件?

./.bashrc --> /etc/basrc --> /etc/profile.d/*.sh

bash支持的引号:

`` 或$():命令替换

touch `date +%y%m%d`.log 或 touch $(date +%y%m%d).log

"":弱引用,可以实现变量替换
'':强引用,不完成变量替换

变量名称:

1. 只能包含字母,数字和下划线。并且不能数字开头:
2. 不应该跟系统中已有的环境变量重名:
3. 最好做到见名知义:

bash变量类型:

定义变量:set varname=jerry # set可以省略 ,等号左右不能留空格
环境变量:export varname=jerry # 作用域为当前shell进程及其子进程;
本地变量:varname=jerry # 作用域为整个bash进程
局部变量:local varname=jerry # 作用域为当前代码段
位置变量:$1,$2, # 引用脚本参数

./a.sh 1 2 # a.sh是$0,1时$1 , 2时$2 
  shift    #


特殊变量:$? # 保存上一个命令的执行状态返回值:

程序执行,可能有两类返回值
  echo $? # 程序状态返回代码(0-255)
    0:正确执行
    1-255:错误执行
  $#    # 输入参数的个数
  $*    # 参数列表
  $@    # 参数列表

引用变量:${name} # {}有时可以省略
撤销变量:unset varname
查看当前shell中的变量: set
查看当前shell中的环境变量:printenv、env、export

数值变量:

let:数值
  declare -i:表示整形
  declare -x:将一个变量声明成环境变量

shell脚本第一行:#!/bin/bash

条件判断类型

条件测试类型:
  整数测试
  字符测试
  文件测试

1、条件测试表达式:中括号必须加空格。

[ expression ]  括号两端必须要有空格
[[ expression ]] 括号两端必须要有空格
test expression

组合测试条件
    -a:and
    -o:or
    !:取非

2、字符串比较

==:测试是否相等,相等为真,不等为假
!=:测试是否不等,不等为真,相等为假
>:字符串大于为真,小于为假
<:字符串小于为真,大于为假
>=
<=
-n:测试指定字符串是否为空,空则真,不空则假
    -n string
-s:测试指定字符串是否不空,不空为真,空为假
    -s string

3、整数比较:

-eq:测试两个整数是否相等:比如 [ $a -eq $b ]
-ne:测试两个整数是否不等:不等,为真:相等,为假:
-gt:测试一个数是否大于另一个数:大于,为真:小于,为假:
-lt:测试一个数是否小于另一个数:小于,为真:大于,为假:
-ge:大于或等于
-le:小于或等于

4、文件测试:

-z string 测试指定字符是否为空,空着真,非空为假
-n string 测试指定字符串是否为不空,空为假 非空为真
-e FILE 测试文件是否存在
-f file 测试文件是否为普通文件
-d file 测试指定路径是否为目录
-r file 测试文件对当前用户是否可读
-w file 测试文件对当前用户是否可写
-x file 测试文件对当前用户是都可执行
-z 是否为空 为空则为真
-a 是否不空

5、条件测试的写法:

1、执行一个命令的结果
if grep -q "rm" fs.sh;then

2、传回一个命令执行结果的相反值
if !grep -q "rm" fs.sh;then

3、使用复合命令((算式))
if ((a>b));then

4、使用bash关键字 [[判断式]]
if [[ str > xyz ]];then

5、使用内置命令:test 判断式
if test "str" > "xyz";then

6、使用内置命令:[判断式] 类似test
if [ "str" > "xyz" ];then

7、使用-a -o进行逻辑组合
[ -r filename -a -x filename ]

8、命令&&命令
if grep -q "rm" fn.sh && [ $a -lt 100 ];then

9、命令||命令
if grep -q "rm" fn.sh || [ $a -lt 100 ];then

shell中如何进行算术运算:

1. let 算术运算表达式
    a=3 b=4  let c=$a+$b  echo $c
2. $[算术运算表达式]
    c=$[$a+$b]
3. $((算术运算表达式))
    c=$(($a+$b))
4. expr 算术运算表达式,表达式中各操作数及运算符之间要有空格,而且要使用命令引用
    c=`expr $a + $b`

命令间的逻辑关系:

逻辑与:&&
  第一个条件为假时,第二个条件不再判断
  第一个条件为真时,第二个条件必须判断
逻辑或:||

read命令

read -p "aaaaa:" cc # 人机交互,cc变量接收输入的字符串

if语句

单分支if语句:

if [ 判断条件 ];then
statement1
...
fi

双分支if语句:

if [ 判断条件 ];then
statement1
...
else
statement1
...
fi

多分支if语句:

if [ 判断条件 ];then
statement1
...
elif [ 判断条件 ];then
statement1
...
else
statement1
...
fi
exit:退出脚本

测试脚本是否有语法错误: 

bash -n 脚本
bash -x 脚本:单步执行

循环

break:退出循环
continue:结束当前循环
seq:生成列表

seq 起始数 结束数
seq 起始数 步进长度 结束数
例子:
  for i in `seq 1 10`;do echo $1 done
  for i in `seq 1 2 10`;do echo $1 done 

for循环:

例1:
    for i in {1..10};do
        echo $i
    done
例2:
    for i in `seq 1 10`;do
        echo $i
    done
例3:
    for (( i=1;i<10;i++ ))
        do
            echo $i
        done

while循环:

例1:
    aa=True
    let mun=0
    while $aa;do 
        if [ $mun -lt 10 ];then
            echo $mun
        else
            aa=False
        fi
        let mun+=1
    done 
例2: 给while循环传入一个文件,read读取每一行传入LINE变量里
    while read LINE;do 
        echo $LINE
    done  < /PATH/TO/SOMEFILE
原文地址:https://www.cnblogs.com/smile1/p/12005397.html