1、第一个Shell程序
1.1 创建Shell文件
命令:touch hello.sh
1.2 编写Shell程序
定义文件声明
#!/bin/bash
echo "Hello word"
#!:表示约定标记,他会告诉系统这个脚本需要什么样子的解释器来执行,即是一种脚本体现
echo:表示命令用于输出文本信息
1.3 修改文件权限
查看每一部分权限 命令 ls -l hello.sh
修改文件权限 chmod +x ./hello.sh
1.4 执行Shell脚本文件
命令: ./hello.sh
2、Shell脚本语法 注释
“#” 表示注释
注意:在Shell脚本中,没有多行注释,只有单行注释
3、Shell脚本语言-变量
3.1 变量定义-注意事项
注意二:变量名和等号不能够有空格(和我们的一般语言不一样)
注意三:变量名首字母必须是字母或者下划线
注意四:变量名中间不允许有空格
注意五:不允许使用标点符号
3.2 只读变量
关键字 :readonly(只读,不能够修改)
3.3 删除变量
语法:unset
案例:unset 变量名
3.4 变量类型
3.4.1 类型一:本地变量
作用域整个bash进程可以使用
语法:name="smile2018"
3.4.2 类型二:局部变量
作用域:当前代码段(修饰符:local)
3.4.3 类型三:环境变量
作用域:当前shell进程以及子进程
语法:export name=“hello”
3.4.4类型四位置变量
name=${0}
age=${1}
sex=${2}
echo "姓名:${name} 年龄:${age} 性别:${sex}"
执行脚本:
./hello.sh tom 23 男
执行结果: 姓名:./hello.sh 年龄:tom 性别:23
${0}表示脚本文件名称 参数从1开始
3.4.5 特殊变量
${0}-特殊变量-文件名称
${?} 表示返回上一个命令执行状态返回值
0:表示执行成功
1:程序执行结果
2:表示程序状态返回码(0-255)
系统预留错误(1,2,127)
echo ${0}
echo ${?}
$# -参数个数
$* -参数列表
$@ -参数列表
$$ -后去当前shell进行ID
$! -执行上一个指令PID
$*和$@区别
$* 参数列表:将所有的参数组成一个字符串
$@ 参数列表:字符串分开
4、Shell脚本语言-字符串
4.1字符串-单引号
4.2字符串-双引号
4.3字符串-拼接
脚本代码
name="Andy"
age=100
sex="男"
info="${name}${age}${sex}"
echo ${info}
执行结果
Andy100男
脚本代码
name="Andy"
age=100
sex="男"
info="姓名:"${name}" 年龄:"${age}" 性别:${sex}"
echo ${info}
执行结果
姓名:Andy 年龄:100 性别:男
4.4字符串-获取字符串长度
语法结构:${#变量名}
脚本代码
name="Andy"
echo ${#name}
脚本结果
4
4.5 字符串-截取
语法:${变量名:开始位置:截取长度}
脚本代码
案例1:从字符串第四个开始截取,截取3个
name="my name is XQ"
result=${name:3:3}
echo ${result}
案例2:从字符串第5个开始截取,到最后一个结束
方式1:
name="my name is XQ"
length=${#name}
result=${name:4:length-1}
echo ${result}
方式2:
name="my name is XQ"
result=${name:4}
echo ${result}
4.6字符串-删除
语法一:$(变量名#删除字符串 正则表达式)
作用:从字符串开头(左边),开始匹配要删除的字符串
案例1:
name="my name is XQ"
result=${name#XQ}
echo ${result}
原因:匹配不到
案例2:
name="my name is XQ"
result=${name#my}
echo ${result}
案例3:查找指定字符第一个,并且删除前面所有的字符(包含自己)
name="my name is XQ"
result=${name#*X}
echo ${result}
语法二: $(变量名##删除字符串 正则表达式)
作用:从字符串尾(右边)开始匹配要删除字符串
案例一
name="my name is XQ"
result=${name##*X}
echo ${result}
总结:语法1和语法2,都是从左边删除到右边,查找方向不一样
语法三:${变量名%删除字符串 正则表达式}
从字符串结尾开始匹配,删除匹配的字符串
案例1:查找第一个字符(匹配第一个)
代码一:
name="my name is XQ"
result=${name%Q}
echo ${result}
案例2:查找指定字符第一个,并且删除前面所有字符(包含自己)
name="my name is XQ"
result=${name%m*}
echo ${result}
语法四:$(变量名%%删除字符串 正则表达式)
案例1:查找指定字符最后一个,并且删除前面所有的字符(包含自己)
name="my name is XQ"
result=${name%%m*}
echo ${result}
总结:从左边删除到右边
#-表示查询方向从左到右
##-表示查询方向从右到左
从右边删除到左边
%-表示查询方向从右到左
%%-表示查询方向从左到右
#!/bin/bash
#a=1
#b=2
#加法运算
#c=`expr $a + $b`
#输出a+b的和
#echo "值为: $c"
#加法运算
#c=`expr $a - $b`
#输出a-b的差
#echo "值为: $c"
#乘法运算
#c=`expr $a \* $b`
#输出a*b的值
#echo "值为: $c"
#除法运算
#c=`expr $b / $a`
#输出b/a的值
#echo "值为: $c"
#"%"运算
#c=`expr $b % $a`
#输出b%a的值
#echo "值为: $c"
#"+"运算
#c=$b
#echo $c
#"=="运算
m=1
n=1
#if [ $a == $b ]
#then
# echo "a等于b"
#else
# echo "a不等于b"
#fi
#if [ $m == $n ]
#then
# echo "m等于n"
#else
# echo "m不等于n"
#fi
#"-ne"检测两个数是否相等 不相等返回true
#if [ $a -ne $b ]
#then
# echo "a不等于b"
#else
# echo "a等于b"
#fi
#"-gt"检测左边数是否大于右边数,如果是返回true
#if [ $b -gt $a ]
#then
# echo "b大于a"
#else
# echo "b小于a"
#fi
#"-lt"检测左边数是否小于右边数,如果是返回true
#if [ $a -lt $b ]
#then
# echo "a小于b"
#else
# echo "b小于a"
#fi
#"-ge" 检测左边数据是否(大于+等于)右边数 如果是,返回true
#if [ $a -ge $b ]
#then
# echo "a大于等于b"
#else
# echo "a小于b"
#fi
#"-le":检测左边数是否(小于+等于)右边数,如果是返回true
#if [ $a -le $b ]
# then
# echo "a小于等于b"
# else
# echo "a大于b"
# fi
#"!":非运算,表达式true,返回true,否则返回false
# if [ $a != $b ]
# then
# echo "a不等于b"
# fi
#"-o":或运算,有一个表达式为true,则返回true
# a=100
# b=200
# if [ $a -lt 200 -o $b -gt 200 ]
# then
# echo "成立"
# fi
#"-a" 与运算。两个表达式为true,则返回true
# a=100
# b=200
# if [ $a -lt 200 -a $b -ge 200 ]
# then
# echo "成立"
# else
# echo "不成立"
# fi
#逻辑运算符 "&&":逻辑且 -and
# a=100
# b=200
# if [ $a -lt 200 -a $b -gt 200 ]
# then
# echo "成立"
# else
# echo "不成立"
# fi
#"||":逻辑OR
# a=100
# b=200
# if [ $a -lt 200 ] || [ $b -gt 200 ]
# then
# echo "成立"
# else
# echo "不成立"
# fi
#"=":检测两个字符串是否相等,如果相等返回true
# a="aa"
# b="bb"
# if [ $a = $b ]
# then
# echo "字符串a等于字符串b"
# else
# echo "字符串a不等于字符串b"
# fi
#"!=" 检测两个字符串是否相等,如果不相等返回true
# a="aa"
# b="bb"
# if [ $a != $b ]
# then
# echo "字符串a不等于字符串b"
# else
# echo "字符串a等于字符串b"
# fi
#"-z": 检测字符串长度是否为0,如果是返回true
# a="aa"
# if [ -z $a ]
# then
# echo "a不存在值"
# else
# echo "a不为空,存在"
# fi
#"-n":检测字符串长度是否为0, 如果不是0,返回true
# a="aa"
# if [ -n "$a" ]
# then
# echo "a不为空,存在"
# else
# echo "a不存在值"
# fi
#"字符串":检测字符串是否为空,不为空返回true
# a="aa"
# if [ $a ]
# then
# echo "a不为空"
# else
# echo "a为空"
# fi
#
#文件测试运算符
# file="/home/shelldir/conditshell.sh"
# file2="/home/shelldir"
# if [ -d $file2 ]
# then
# echo "是一个目录"
# else
# echo "不是一个目录"
# fi
#
#
#"-r file":检测文件是否可读,如果是,那么返回true
# file="/home/shelldir/conditshell.sh"
# if [ -r $file ]
# then
# echo "可读"
# else
# echo "不可读"
# fi
#
#"-w file":检测文件是否可写,如果是,那么返回true
# file="/home/shelldir/conditshell.sh"
# if [ -w $file ]
# then
# echo "可写"
# else
# echo "不可写"
# fi
#
#"-x file“:检测文件是否是可执行文件,如果是返回true
## file="/home/shelldir/conditshell.sh"
# if [ -x $file ]
# then
# echo "可执行"
# else
# echo "不可执行"
# fi
#"-f file":检测文件是否是一个普通文件(是目录为false,是普通文件为true),如果是,那么返回true
# file="/home/shelldir"
# if [ -f $file ]
# then
# echo "文件为普通文件"
# else
# echo "文件为特殊文件"
# fi
#
#"-s file":检测文件是否为空(文件有内容),如果是,那么返回true
# file="/home/shelldir/conditshell.sh"
# if [ -s $file ]
# then
# echo "文件有内容"
# else
# echo "文件没有内容"
# fi
#
#"-e file":检测文件是否存在(包含了:目录和文件),如果是,返回true
# file="/Users/Wisdom/Desktop/进阶代码/流媒体/第三天/hello.sh"
# if [ -e $file ]
# then
# echo "存在"
# else
# echo "不存在"
# fi
#
#
#"if"语句
## 代码结构
# a="aa"
# b="aa"
# if [ $a == $b ]
# then
# echo "字符串a等于字符串b"
# fi
#
#"if else"语句
#代码结构
# a="aa"
# b="bb"
# if [ $a = $b ]
# then
# echo "字符串a等于字符串b"
# else
# echo "字符串a不等于字符串b"
# fi
#"if-else-if-else"
# a="aa"
# b="bb"
# if [ $a = $b ]
# then
# echo "字符串a等于字符串b"
# elif [ $a ]
# then
# echo "字符串a不能为空"
# else
# echo "字符串a不等于字符串b"
# fi
#
#
#
# "case"语句
# number=2
# case $number in
# 1)
# echo "等于1"
# ;;
# 2)
# echo "等于2"
# ;;
# 3)
# echo "等于3"
# ;;
# esac
#
#
#"while"循环
# a=1
# while(($a<3))
# do
# echo $a
# a=`expr $a + 1`
# done
#"for"循环语句
# 语法变量
# for 变量名 in item1 item2 item2...
# do
# 代码
# done
# 代码案例一
for name in "aa" "bb" "cc"
do
echo $name
done
cat 介绍
作用:
作用一:查看文件内容
作用二:连接文件
作用三:创建一个文件或者多个文件
作用四:重定向输出到终端
作用五:重定向到文件
语法:cat[选项][文件]
案例演示
案例一:查看文件内容
cat fileA.sh
案例二: cat -n A.sh
-n选项:可以显示文件内容和行号
案例三: cat -b A.sh
-b选项:和“-n”类似功能,但是只标记非空白行行号
案例四: cat -e A.sh
-e选项:在每一行内容最后加入了一个“$”符号,在需要将多行内容转换为一行内容的时候,非常有用
案例五:cat
接受标准输入,同时还会输出标准输出(敲回车键)
退出:control + C
[root@hadoop01 shelldir]# vim readshell.sh
# testFunc
# echo "调用后"
#Shell脚本语言-输入、输出重定向
#
# 1、 输入重定向
# 语法结构:wc 文件名称
# 1.1 "<" 输入重定向
# 命令代码:wc A.sh
# 将A.sh中的内容读取到控制台
# wc读取到了三个重要信息
# 第一个参数:文本行数
# 第二个参数:文本词数
# 第三个参数:文本字节数
# 93 192 2028 readshell.sh
#输出重定向
# ">": 我们把方向指向一份文件,那么将文件中的内容删除,写入新的内容
#脚本文件A.sh代码
#!/bin/bash
echo "我是文件A"
#脚本文件B.sh代码
#!/bin/bash
echo "我是文件B"
echo "北京欢迎你" > A.sh
#执行脚本代码
./B.sh
#总结:替换内容-将B.sh输出内容替换了A.sh中内容
# ">>" 追加
[root@hadoop01 shelldir]# vim hello_b.sh
#!/bin/bash
echo "我是hello_b"
#将"北京欢迎你"替换掉hello.sh文件的所有内容
#echo "北京欢迎你" > hello.sh
#将"北京欢迎你"追加到hello.sh文件尾部
echo "北京欢迎你" >> hello.sh
[root@hadoop01 shelldir]# vim hello.sh
#!/bin/bash
echo "我是hello.sh文件"
北京欢迎你