linux shell random 3,Linux

Shell格式

1、扩展名: xxx.sh

2、正文第一行必须指定解释器: #!/bin/bash

shell执行方式

# 方式一: 加权限, ./xxx.sh 执行

1、chmod +x xxx.sh

2、./xxx.sh

# 方式二: 手动指定解释器

bash xxx.sh

自定义变量

# 1. 定义变量

变量名=值 ----> 注意: =两侧绝对不能有空格

eg1: name="take me to your heart"

# 2. 调用变量的格式

echo $变量名

# 01_variable_1.sh

name="风云雄霸天下"

echo $name

# 3. 小细节: 单引号和双引号的区别

单引号: 无法获取变量的值

双引号: 可以获取变量的值

环境变量+位置变量+预设变量

# 环境变量

echo $USER -- 当前用户

echo $UID -- 当前用户的UID号

echo $PWD -- 当前路径

echo $PATH -- 命令搜索路径

# 位置变量

$1 $2 $3 ... ... shell的位置变量

# 预定义变量

$# $* $?

# $? : 返回上一条命令执行的状态(0代表正确,非0代表失败)

练习

输出$1+$2,例如输出结果: 3+5

#!/bin/bash

echo $1+$2

变量赋值 - 接收用户从终端输入的值

# 语法格式

read -p 提示信息 变量名

# 05_read.sh

#!/bin/bash

read -p 请输入姓名: name

echo "您输入的姓名是:$name"

# 指定超时时间

read -p 提示信息 变量名

read -t n -p 提示信息 变量名

# 06_read_t.sh 限制3秒中之内必须输入值

#!/bin/bash

read -t 3 -p 请输入用户名: username

练习

1、输入学生姓名: 赵敏

2、输入学生成绩: 88

3、输出: 赵敏的成绩为88分

Ubuntu设置sudo免密码

# 通过更改 /etc/sudoers 实现

1、备份: sudo cp /etc/sudoers .

2、修改: sudo vi /etc/sudoers

添加: tarena ALL=(ALL) NOPASSWD : ALL

练习

请使用位置变量的方式实现用户名的创建

#!/bin/bash

sudo useradd $1

echo "$1创建成功"

运行: ./文件名 用户名

# 创建用户名: useradd 用户名

# 删除用户名:userdel 用户名

shell - 算术运算符

# 运算符

1、+ - * / %

2、++ : 自加1运算,类似于python中 i+=1

3、-- : 同++

# 运算命令

1、let 运算表达式

i=1

let i++

echo $i

2、expr 运算表达式

i=1

sum=`expr $i + 5` # +两侧要有空格

echo $sum

3、$[]

echo $[1+1]

echo $[1-1]

echo $[a+a] # 调用变量不用多次添加$符号

echo $[1*1] # 乘法无需转义

练习

使用 位置变量+以上方法一、二中任何一种,实现2个数字的相加

#!/bin/bash

echo $[$1+$2]

echo `expr $1 + $2`

shell - 比较运算符

# 语法格式

[ 判断语句 ] # 注意括号必须有空格

# 组合

&& 并且

|| 或者

A命令 && B命令 //仅当A成功时才执行B

A命令 || B命令 //仅当A失败时才执行B

思考: [ a == a ] && echo Y || echo N 代表什么意思?

#Y

# 1、字符比较

[ A == A ] #相等(等号两边需要有空格)

[ A != B ] #不相等

[ -z $变量 ] #判断是否为空

思考(Y 还是 N): [ $USER == tarena ] && echo Y || echo N

练习: 用户输入用户名,判断是否为空,不为空时创建,否则直接退出程序

#!/bin/bash

read -p "请输入用户名:" username

[ -z $username ] && exit

sudo useradd $username

# 2、数字比较

-eq 等于(equal)

-ne 不等于(not equal)

-gt 大于(greater than)

-ge 大于等于(great or equal)

-lt 小于(less than)

-le 小于等于(less or equal)

思考输出什么:

[ 10 -eq 10 ] && echo Y || echo N #Y

[ 11 -le 10 ] && echo Y || echo N #N

[ 12 -ge 3 ] && echo Y || echo N #Y

# 3、文件|目录比较

[ -e 文件或目录 ] #是否存在exist

[ -f 文件 ] #存在且为文件file

[ -d 目录 ] #存在且为目录directory

[ -r 文件或目录 ] #判断是否可读read

[ -w 文件或目录 ] #判断是否可写write

[ -x 文件或目录 ] #判断是否可执行

思考输出:

[ -e /etc/passwd ] && echo Y || echo N #Y

[ -f /etc/passwd ] && echo Y || echo N #Y

[ -d /etc/passwd ] && echo Y || echo N # N

if分支结构

# 1、单分支语法格式

if 判断 ;then

命令

命令

fi

# 2、双分支语法格式

if 判断 ;then

命令1

else

命令2

fi

# 3、多分支语法格式

if 判断;then

命令1

elif 判断 ;then

命令2

else

命令3

fi

# 示例

#!/bin/bash

if [ $USER == tarena ];then

echo "Yes,You are Tarena."

else

echo "You are other man."

练习

使用shell编写猜数字游戏,无须循环

# 计算机随机出数字:computer=$RANDOM

#!/bin/bash

# 生成1-5直接的随机数

num=$[RANDOM%5+1]

read -p "输入你猜的数字:" num_input

echo $num

if [ $num -eq $num_input ];then

echo "Well done!"

exit

elif [ $num_input -lt $num ];then

echo "Too small"

else

echo "Too big"

fi

for循环

# 语法格式

for 变量 in 值序列

do

命令

done

# 示例

for i in 1 2 3 4 5

do

echo "hello world"

done

# 示例2: 1-8

for i in {1..8}

# 示例3: 执行Linux命令,获取结果

for i in `Linux命令`

# 示例4: 造数 seq

seq 1 2 10 # 1 3 5 7 9 (起始值 步长 终止值)

造数

seq 1 2 10 # 1 3 5 7 9 (起始值 步长 终止值)

seq 3 8 #3 4 5 6 7 8

练习

把猜数字游戏改为for循环,猜测100次

#!/bin/bash

#把猜数字游戏改为for循环,猜测100次

computer=$[RANDOM%10000+1]

for i in {1..30}

do

read -p "please guess:" guess

if [ $computer -eq $guess ];then

echo "Well done!"

exit

elif [ $computer -gt $guess ];then

echo "Too small"

else

echo "Too big"

fi

done

# 练习:判断指定网段的IP地址哪些可以用,哪些不能用?

#!/bin/bash

online=0

down=0

for i in {2..254}

do

ping -c 1 176.209.108.$i &> /dev/null #黑洞

if [ $? -eq 0 ];then

echo "176.209.108.$i onLine "

let online++

else

echo "176.209.108.$i Down"

let down++

fi

echo "Online : $online"

echo "Down : $down"

done

mysql 设置远程连接

1. 开启远程连接 - 服务端

sudo vim /etc/mysql/mysql.conf.d/mysqldf

将如下行注释掉

# bind-address 127.0.0.1

sudo service mysql restart

2. 授权用户

mysql -uroot -p123456

mysql > grant all privileges on *.*to 'tiger'@'%'

c-for 循环

for ((赋初值;条件;步长))

do

执行命令

done

# 示例 打印1-5 之间的整数

for ((i=1;i<=5;i++))

do

echo $i

done

while循环

# 语法格式

while 条件判断

do

命令

done

# 示例

#!/bin/bash

i=1

while [ $i -lt 5 ]

do

echo $i

let i++

done

# 死循环

while:

do

执行命令

done

# 示例:

#!/bin/bash

# 简陋的计时器

i=1

while :

do

echo $i

let i++

sleep 1

clear

done

文本处理工具-sed

# 1. 定义: 非交互式文本编辑器,逐行处理

# 2. 语法格式

sed [选项] '条件指令' 文件名

指令: 增删改查

# 查询 -> p

sed -n 'p' 17_sed.txt # 打印所有内容

sed -n '1p' 17_sed.txt #打印第1行内容

sed -n '1,3p' 17_sed.txt # 打印第1到3行内容

sed -n '1p;3p' 17_sed.txt # 打印1和3行内容

# 删除 -> d

sed -i '1d' 17_sed.txt # 删除第一行

sed -i '$d' 17_sed.txt # 删除最后一行

# 改 -> c

sed -i '1c内容' 17_sed.txt #修改第1行

sed -i -e '1c李白' -e '3c杜甫' 17_sed.txt #修改第1和第3行

# 增加 -> a i

a : 在当前处理行的下一行插入

i: 在当前处理航的上一行插入

sed -i '1a李白' 17_sed.txt

# 替换 -> s

sed -i '条件/原内容/新内容/选项' 文件名

选项: g 表示全局替换 i 忽略字母大小写

# 替换1到3行中的陶渊明

sed -i '1,3s/陶渊明/李白/' 17_sed.txt

# 替换每行中所有陶渊明,加g选项

sed -i '1,3s/陶渊明/李白/g' 17_sed.txt

练习

每隔1秒,从1个文件中随机取1行,在大屏幕上显示

# 1. 文件的行数,利用$RANDOM 想办法取出随机数

wc -l 17_sed.txt

sed -n '随机数p'

# 代码实现:

#!/bin/bash

file="17_sed.txt"

number=$(sed -n '$=' $file)

while :

do

clear

l=$[RANDOM%number+1]

sed -n "${l}p" $file

sleep 1

done

文件|目录判断示例

/home/tarena/libai

判断路径是否存在

不存在:创建

已存在:不做操作

linux shell random 3,Linux

Shell格式

1、扩展名: xxx.sh

2、正文第一行必须指定解释器: #!/bin/bash

shell执行方式

# 方式一: 加权限, ./xxx.sh 执行

1、chmod +x xxx.sh

2、./xxx.sh

# 方式二: 手动指定解释器

bash xxx.sh

自定义变量

# 1. 定义变量

变量名=值 ----> 注意: =两侧绝对不能有空格

eg1: name="take me to your heart"

# 2. 调用变量的格式

echo $变量名

# 01_variable_1.sh

name="风云雄霸天下"

echo $name

# 3. 小细节: 单引号和双引号的区别

单引号: 无法获取变量的值

双引号: 可以获取变量的值

环境变量+位置变量+预设变量

# 环境变量

echo $USER -- 当前用户

echo $UID -- 当前用户的UID号

echo $PWD -- 当前路径

echo $PATH -- 命令搜索路径

# 位置变量

$1 $2 $3 ... ... shell的位置变量

# 预定义变量

$# $* $?

# $? : 返回上一条命令执行的状态(0代表正确,非0代表失败)

练习

输出$1+$2,例如输出结果: 3+5

#!/bin/bash

echo $1+$2

变量赋值 - 接收用户从终端输入的值

# 语法格式

read -p 提示信息 变量名

# 05_read.sh

#!/bin/bash

read -p 请输入姓名: name

echo "您输入的姓名是:$name"

# 指定超时时间

read -p 提示信息 变量名

read -t n -p 提示信息 变量名

# 06_read_t.sh 限制3秒中之内必须输入值

#!/bin/bash

read -t 3 -p 请输入用户名: username

练习

1、输入学生姓名: 赵敏

2、输入学生成绩: 88

3、输出: 赵敏的成绩为88分

Ubuntu设置sudo免密码

# 通过更改 /etc/sudoers 实现

1、备份: sudo cp /etc/sudoers .

2、修改: sudo vi /etc/sudoers

添加: tarena ALL=(ALL) NOPASSWD : ALL

练习

请使用位置变量的方式实现用户名的创建

#!/bin/bash

sudo useradd $1

echo "$1创建成功"

运行: ./文件名 用户名

# 创建用户名: useradd 用户名

# 删除用户名:userdel 用户名

shell - 算术运算符

# 运算符

1、+ - * / %

2、++ : 自加1运算,类似于python中 i+=1

3、-- : 同++

# 运算命令

1、let 运算表达式

i=1

let i++

echo $i

2、expr 运算表达式

i=1

sum=`expr $i + 5` # +两侧要有空格

echo $sum

3、$[]

echo $[1+1]

echo $[1-1]

echo $[a+a] # 调用变量不用多次添加$符号

echo $[1*1] # 乘法无需转义

练习

使用 位置变量+以上方法一、二中任何一种,实现2个数字的相加

#!/bin/bash

echo $[$1+$2]

echo `expr $1 + $2`

shell - 比较运算符

# 语法格式

[ 判断语句 ] # 注意括号必须有空格

# 组合

&& 并且

|| 或者

A命令 && B命令 //仅当A成功时才执行B

A命令 || B命令 //仅当A失败时才执行B

思考: [ a == a ] && echo Y || echo N 代表什么意思?

#Y

# 1、字符比较

[ A == A ] #相等(等号两边需要有空格)

[ A != B ] #不相等

[ -z $变量 ] #判断是否为空

思考(Y 还是 N): [ $USER == tarena ] && echo Y || echo N

练习: 用户输入用户名,判断是否为空,不为空时创建,否则直接退出程序

#!/bin/bash

read -p "请输入用户名:" username

[ -z $username ] && exit

sudo useradd $username

# 2、数字比较

-eq 等于(equal)

-ne 不等于(not equal)

-gt 大于(greater than)

-ge 大于等于(great or equal)

-lt 小于(less than)

-le 小于等于(less or equal)

思考输出什么:

[ 10 -eq 10 ] && echo Y || echo N #Y

[ 11 -le 10 ] && echo Y || echo N #N

[ 12 -ge 3 ] && echo Y || echo N #Y

# 3、文件|目录比较

[ -e 文件或目录 ] #是否存在exist

[ -f 文件 ] #存在且为文件file

[ -d 目录 ] #存在且为目录directory

[ -r 文件或目录 ] #判断是否可读read

[ -w 文件或目录 ] #判断是否可写write

[ -x 文件或目录 ] #判断是否可执行

思考输出:

[ -e /etc/passwd ] && echo Y || echo N #Y

[ -f /etc/passwd ] && echo Y || echo N #Y

[ -d /etc/passwd ] && echo Y || echo N # N

if分支结构

# 1、单分支语法格式

if 判断 ;then

命令

命令

fi

# 2、双分支语法格式

if 判断 ;then

命令1

else

命令2

fi

# 3、多分支语法格式

if 判断;then

命令1

elif 判断 ;then

命令2

else

命令3

fi

# 示例

#!/bin/bash

if [ $USER == tarena ];then

echo "Yes,You are Tarena."

else

echo "You are other man."

练习

使用shell编写猜数字游戏,无须循环

# 计算机随机出数字:computer=$RANDOM

#!/bin/bash

# 生成1-5直接的随机数

num=$[RANDOM%5+1]

read -p "输入你猜的数字:" num_input

echo $num

if [ $num -eq $num_input ];then

echo "Well done!"

exit

elif [ $num_input -lt $num ];then

echo "Too small"

else

echo "Too big"

fi

for循环

# 语法格式

for 变量 in 值序列

do

命令

done

# 示例

for i in 1 2 3 4 5

do

echo "hello world"

done

# 示例2: 1-8

for i in {1..8}

# 示例3: 执行Linux命令,获取结果

for i in `Linux命令`

# 示例4: 造数 seq

seq 1 2 10 # 1 3 5 7 9 (起始值 步长 终止值)

造数

seq 1 2 10 # 1 3 5 7 9 (起始值 步长 终止值)

seq 3 8 #3 4 5 6 7 8

练习

把猜数字游戏改为for循环,猜测100次

#!/bin/bash

#把猜数字游戏改为for循环,猜测100次

computer=$[RANDOM%10000+1]

for i in {1..30}

do

read -p "please guess:" guess

if [ $computer -eq $guess ];then

echo "Well done!"

exit

elif [ $computer -gt $guess ];then

echo "Too small"

else

echo "Too big"

fi

done

# 练习:判断指定网段的IP地址哪些可以用,哪些不能用?

#!/bin/bash

online=0

down=0

for i in {2..254}

do

ping -c 1 176.209.108.$i &> /dev/null #黑洞

if [ $? -eq 0 ];then

echo "176.209.108.$i onLine "

let online++

else

echo "176.209.108.$i Down"

let down++

fi

echo "Online : $online"

echo "Down : $down"

done

mysql 设置远程连接

1. 开启远程连接 - 服务端

sudo vim /etc/mysql/mysql.conf.d/mysqldf

将如下行注释掉

# bind-address 127.0.0.1

sudo service mysql restart

2. 授权用户

mysql -uroot -p123456

mysql > grant all privileges on *.*to 'tiger'@'%'

c-for 循环

for ((赋初值;条件;步长))

do

执行命令

done

# 示例 打印1-5 之间的整数

for ((i=1;i<=5;i++))

do

echo $i

done

while循环

# 语法格式

while 条件判断

do

命令

done

# 示例

#!/bin/bash

i=1

while [ $i -lt 5 ]

do

echo $i

let i++

done

# 死循环

while:

do

执行命令

done

# 示例:

#!/bin/bash

# 简陋的计时器

i=1

while :

do

echo $i

let i++

sleep 1

clear

done

文本处理工具-sed

# 1. 定义: 非交互式文本编辑器,逐行处理

# 2. 语法格式

sed [选项] '条件指令' 文件名

指令: 增删改查

# 查询 -> p

sed -n 'p' 17_sed.txt # 打印所有内容

sed -n '1p' 17_sed.txt #打印第1行内容

sed -n '1,3p' 17_sed.txt # 打印第1到3行内容

sed -n '1p;3p' 17_sed.txt # 打印1和3行内容

# 删除 -> d

sed -i '1d' 17_sed.txt # 删除第一行

sed -i '$d' 17_sed.txt # 删除最后一行

# 改 -> c

sed -i '1c内容' 17_sed.txt #修改第1行

sed -i -e '1c李白' -e '3c杜甫' 17_sed.txt #修改第1和第3行

# 增加 -> a i

a : 在当前处理行的下一行插入

i: 在当前处理航的上一行插入

sed -i '1a李白' 17_sed.txt

# 替换 -> s

sed -i '条件/原内容/新内容/选项' 文件名

选项: g 表示全局替换 i 忽略字母大小写

# 替换1到3行中的陶渊明

sed -i '1,3s/陶渊明/李白/' 17_sed.txt

# 替换每行中所有陶渊明,加g选项

sed -i '1,3s/陶渊明/李白/g' 17_sed.txt

练习

每隔1秒,从1个文件中随机取1行,在大屏幕上显示

# 1. 文件的行数,利用$RANDOM 想办法取出随机数

wc -l 17_sed.txt

sed -n '随机数p'

# 代码实现:

#!/bin/bash

file="17_sed.txt"

number=$(sed -n '$=' $file)

while :

do

clear

l=$[RANDOM%number+1]

sed -n "${l}p" $file

sleep 1

done

文件|目录判断示例

/home/tarena/libai

判断路径是否存在

不存在:创建

已存在:不做操作