Linux-Shell(三)

  • 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/mysqld.cnf
将如下行注释掉
# 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(三))