返回顶部

2-shell高级

根文件有关系的变量

$?  获取文件执行或者命令执行的返回状态值

返回的状态值为0,表示执行成功。非0则表示文件或命令未找到

 

 

编辑一个文件 lingshi.sh 代码如下

#!/bin/bash
#这是一个临时的文件
echo '张彪'
echo $?

 执行该文件

bash linshi.sh 

  

 

如想要知道一个脚本中的命令有没有执行成功

vim ceshi.sh代码如下:

#!/bin/bash
# 文件执行返回状态值演示
cd //home/python/Desktop/3-shell/2-day
echo "执行返回状态值是 $?"
pwd
echo "执行返回状态值是 $?"
./ceshi.sh
echo "执行返回状态值是 $?"

 

执行该脚本

bash ceshi.sh

  

由于ceshi.sh不是可执行文件,脚本中 ./ceshi.sh这条命令没有执行成功

内置变量之字符相关

获取随机的字符串

场景:创建一个用户,密码是随机生成的

生成随机数: $RANDOM 生成随机的5位数以内的数字

echo $RANDOM 

  

把生成的随机数进行md5加密用到md5sum

加密后,会返回两部分的内容

echo $RANDOM | md5sum

 

需求来了,加密输出的结果返回两部分的内容,我只需要前面的一部分,这时候就要用到 awk '{print $1}' 命令获取第一部分的内容

echo $RANDOM | md5sum | awk '{print $1}'

每次都写那么长的命令,显得特别的麻烦,这时候可以考虑,把这条命令复制给一个命令变量

str=$(echo $RANDOM | md5sum | awk '{print $1}')

echo $str 

字符串相关的内置变量:截取  

${变量名:起始位置:截取长度}

  

示例:从头截取8个字符

echo $str

echo ${str:0:8}

示例:从末尾截取8个字符

echo ${str: -8}

echo ${str:0-8}

  

 内置变量之默认值

场景一:
  变量a如果有内容,那么就输出a的变量值
  变量a如果没有内容,那么就输出默认的内容

格式如下:

${变量名:-默认值}

  

套餐案例:

  如果我输入的参数为空,那么输出内容是 "您选择的套餐是: 套餐 1"
  如果我输入的参数为n,那么输出内容是 "您选择的套餐是: 套餐 n"

编辑一个文件taocan.sh代码如下:

#!/bin/bash
# 套餐选择演示
a="$1"
echo "您选择的套餐是: 套餐 ${a:-1}"

 

执行脚本文件

# 没选择,默认的套餐
bash taocan.sh 

# 选择第二种套餐
bash taocan.sh 2

场景二:  
  无论变量a是否有内容,都输出默认值
格式:

${变量名+默认值}

场景示例:
不管我说国家法定结婚年龄是 多少岁,都输出 国家法定结婚年龄(男性)是 22 岁

编辑一个脚本morenzhi2.sh 代码如下:

#!/bin/bash
# 默认值演示示例二
a="$1"
echo "我认为国家的法定年龄是${a}"
echo "国家法定结婚年龄(男性)是 ${a+22} 岁"

 

执行该脚本

bash morenzhi2.sh

bash morenzhi2.sh 23

shell 表达式

  shell验证操作

方式一:
 

 [ 表达式 ]

  0 代表 真,条件成了
  1 代表假,条件不成了

# 条件成立
[ 1 = 1 ]
echo $?

# 条件不成立
[ 1 = 2 ]
echo $?

  

 

方式二:

test 表达式

  0 代表 真,条件成了
  1 代表假,条件不成了

 

# 条件成立
test 1 = 1
echo $?

# 条件不成立
test 1 = 2
echo $?

  

shell表达式

逻辑相关

&& 

命令1 && 命令2
 特性:夫唱妇随

    如果命令1执行成功,那么我才执行命令2 -- 夫唱妇随
    如果命令1执行失败,那么命令2也不执行

 

# 条件成立,执行后面的
[ 1 = 1 ] && echo "条件成立"


# 条件不成立,不执行后面的操作
[ 1 = 2 ] && echo "条件成立"

  

|| 

命令1 || 命令2

特性:和前面的对着干,相反

  如果命令1执行成功,那么命令2不执行 -- 对着干
  如果命令1执行失败,那么命令2执行

# 前面条件不成立,后面执行
[ 1 = 2 ] || echo "条件不成立"


# 前面条件成立,后面不执行
[ 1 = 2 ] || echo "条件不成立"

文件相关

-f 判断输入内容是否是一个文件

-d 判断输入内容是否是一个目录

-x 判断输入内容是否可执行

 

先 ls 查看当前目录下的所有文件  

  

例子: 

-f 判断输入内容是否是一个文件

[ -f ceshi.sh ] && echo "是一个文件"

例子:

-d 判断输入内容是否是一个目录

[ -d linshi ] && echo "是一个目录"

例子:

-x 判断输入内容是否可执行

[ -x linshi.sh ] && echo "可执行"

数字相关

-gt  大于

-lt   小于

-eq  等于

-ne  不等于

 

创建一个 num2.sh 传入的位置参数等于两个,脚本才会运行,代码如下:

#!/bin/bash
# 数字表达式 -ne使用场景,传入两个参数脚本才会运行
[ "$#" -ne 2 ] && echo " $0 脚本使用帮助信息: $0 [ arg1 arg2 ]"
[ "$#" -eq 2 ] && echo "$0 脚本正在执行......"

 

运行该脚本

# 传入两个参数,脚本运行
bash num2.sh 1 2 


# 不传参数,或者传的参数不是两个脚本都不会运行
bash num2.sh 

  

字符串相关

==	两侧的内容是一致的
!=	两侧的内容是不一致的  

 

创建一个 str.sh 的脚本文件,代码如下:

#!/bin/bash
# 字符串表达式的演示
a="$1"
b="$2"

[ "${a}" == "${b}" ] && echo "您输入的两个参数内容是一致的"
[ "${a}" != "${b}" ] && echo "您输入的两个参数内容是不一致的"

 

执行脚本,分别传入不同的位置参数:

bash str.sh s 

bash str.sh s a

bash str.sh s s

bash str.sh

流程控制

  简单流程控制

shell中的if,不论是单if还是多elif后面紧跟的是then,见if下面就会有then,结尾的固定是fi

单if语句:

if 条件
then
	执行语句
fi

 

场景:
  单一条件,只有一个输出

示例:
  如果我输入内容是 nan,则返回你的性别是男

创建脚本danif.sh ,代码如下:

#!/bin/bash
# 单if语句的使用场景
arg=$1
if [ "${arg}" == "nan" ]
then
	echo "您的性别是 男"
fi  

 

执行该脚本

bash danif.sh nan

bash danif.sh nv

  

双if语句

一个条件,两种结果

if 条件1
then
	执行语句1
elif 条件2
then
	执行语句2
else
	执行语句3
fi			

  

创建一个脚本shuangif.sh代码如下:

#!/bin/bash
# 单if语句的使用场景
if [ "$1" == "nan" ]
then
    echo "您的性别是 男"
else
    echo "您的性别是 女"
fi

 

执行该脚本文件

bash shuangif.sh nan

bash shuangif.sh nv

bash shuangif.sh nvdsaf

 

多if语句:

if 条件1
then
    执行语句1
elif 条件2
then
    执行语句2
else
    执行语句3
fi        

场景:
  n个条件,n+1个结果

创建一个脚本duoif.sh代码如下:

#!/bin/bash
# 单if语句的使用场景
if [ "$1" == "nan" ]
then
    echo "您的性别是 男"
elif [ "$1" == "nv" ]
then
    echo "您的性别是 女"
else
    echo "您的性别,我不知道"
fi

 

执行该脚本文件

bash duoif.sh nan

bash duoif.sh nv

bash duoif.sh n

case语句

有一个案例来引出case语句

模拟对网卡服务的一些操作

/etc/init.d/networking 

创建一个脚本zonghe.sh代码如下:

#!/bin/bash
# 多if语句的使用场景
if [ "$1" == "start" ]
then
    echo "启动 $0 脚本"
elif [ "$1" == "stop" ]
then
    echo "关闭 $0 脚本"
elif [ "$1" == "restart" ]
then
    echo "重启 $0 脚本"
else
    echo "$0 脚本的使用方式: $0 [ start | stop | restart ]"
fi

 

执行该脚本

bash zonghe.sh 

bash zonghe.sh start

case语句

case 值 in
    值1)
        执行语句
            ;;
    值2)
        执行语句
        ;;                            
    值3)
        执行语句
        ;;
    值4)
        执行语句
        ;;
esac    

场景:服务启动

创建一个脚本文件cash.sh代码如下:

#!/bin/bash
# case语句使用场景
case "$1" in                    
    "start")                    
        echo "启动 $0 脚本"                    
        ;;                    
    "stop")                    
        echo "关闭 $0 脚本"                    
        ;;                            
    "restart")                    
        echo "重启 $0 脚本"                    
        ;;                    
    *)                    
        echo "$0 脚本的使用方式: $0 [ start | stop | restart ]"                
        ;;                    
esac

 

执行该脚本文件

bash cash.sh 

bash cash.sh start

 循环

  for循环

for 条件
do
    执行语句
done

场景:
  遍历列表

示例:遍历当前文件下的所有文件

查看当前文件下的所有文件和当前的路径

pwd
ls

  

创建一个脚本文件for.sh代码如下:

#!/bin/bash
#for语句
for i in `ls /home/python/Desktop/3-shell/2-day`
do
    echo "该文件下有$i文件"
done

 

执行该脚本

bash for.sh

  

shell中变量的计算方法

格式;

let  变量名a=变量名a+1
a=$((变量名a+1))  

 

实例如下:

a=1

let a=a+1

echo $a

a=$((a+1))

echo $a

while 语句:

while 条件
do
    执行语句
done  

 

创建脚本文件while.sh代码如下:

#!/bin/bash
#while语句
a=1
while [ $a -lt 5 ]
do
    echo $a
    let a=a+1
done

 

执行该脚本文件

bash while.sh

  

 until 语句:

条件不满足一值往下执行,条件满足退出循环

until 条件
do
    执行语句
done

 

创建脚本until.sh代码如下:

#!/bin/bash
# until的示例
a=1
until [ "${a}" -gt 4 ] 
do
    echo "${a}"
    a=$((a+1))
done

 

执行该脚本

bash until.sh

复杂流程控制  

shell函数格式

定义函数:

函数名(){
	函数体
}

调用函数:

函数名

 

创建一个脚本fun.sh代码如下:

#!/bin/bash
# 函数使用场景一:执行频繁的命令
# 定义一个函数
dayin(){
        echo "wo de mingzi shi"
    }
#调用函数
dayin  

 

执行该脚本

bash fun.sh

 

给函数传参数  

创建一个脚本fun_chuangcan.sh代码如下:

#!/bin/bash
# 函数的使用场景二

# 函数接受的参数用位置参数来表示
dayin(){
    echo "wo de mingzi shi $1"
}
# 调用并传递参数
dayin 111  

 

执行该脚本

bash fun_chuancan.sh

  

还可以手动的传参数代码如下:

#!/bin/bash
# 函数的使用场景二

# 函数接受的参数用位置参数来表示
dayin(){
    echo "wo de mingzi shi $1"
}
# 调用并传递参数
dayin $1

 

执行该脚本

bash fun_chuancan.sh sassaass

  

函数使用场景:  

  执行频繁的命令
  执行命令格式相近的命令

 

函数使用场景一:执行频繁的命令

创建一个脚本fun1.sh代码如下:

#!/bin/bash
# 函数使用场景一:执行频繁的命令
dayin(){
	echo "wo de mingzi shi  111"
}
dayin
dayin
dayin
dayin
dayin
dayin  

 

执行该脚本文件

bash fun1.sh

  

场景二:执行命令格式相近的命令

创建一个脚本fun2.sh代码如下:

#!/bin/bash
# 函数的使用场景二
dayin(){
	echo "wo de mingzi shi $1"
}
dayin a
dayin b
dayin c
dayin d
dayin e  

 

执行该脚本文件

bash fun2.sh

  

函数传参多个,函数体内调用示例

创建一个脚本fun3.sh代码如下:

#!/bin/bash
# 函数的使用场景二
dayin(){
	echo "wo de mingzi shi $1"
	echo "wo de mingzi shi $2"
	echo "wo de mingzi shi $3"
}
dayin 111 df dfs

 

执行该脚本

bash fun3.sh

  

  

 

posted @ 2018-01-31 22:47  Crazymagic  阅读(284)  评论(0编辑  收藏  举报