Shell脚本学习语法笔记

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/wj610671226/article/details/81368597

Shell脚本学习语法笔记

变量

  • 定义规则

1、变量名不能出现$,和PHP不同
2、变量名和等号之间不能有空格
3、变量名首字母为字母加下划线
4、变量名不允许有空格

// demo
name="zhansan"
// 输出变量
echo $name
echo ${name}
# 变量名外面的花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界
echo "hello ${name}"
  • 只读变量readonly
name="zhansan"
readonly name
name="lishi"
输出:name: readonly variable
  • 删除变量
    unset name

  • 变量类型
    1、本地变量:作用于当前bash进程使用
    2、局部变量:当前代码段 local name=”zhansan”
    3、环境变量:当前shell进程以及子进程使用 export name=”环境变量”
    4、位置变量

#假设当前shell脚本文件名为demo.sh
name=${1}
age=${2}
echo "name = ${name}, age = ${age}"
// 外部调用
./demo.sh zhangsan 22

5、特殊变量

${0} 表示当前文件名
$#  表示参数个数
$*  表示参数列表 ,将所有参数合并为一个字符串
$@  表示参数列表,参数是一个个分开的
${?} 表示返回上一个命令执行状态返回值 0 表示成功 1表示失败

字符串

字符串可以用单引号,也可以用双引号,双引号里可以有变量,双引号里可以出现转义字符

  • 字符串拼接
name="zhansan"
world="ni hao"
echo $world $name
echo "hello $name $world"
  • 获取字符串长度
echo ${#name}
  • 截取字符串
    语法:${变量名:开始位置:截取长度}
echo ${name:1:3}
// 输出 hans
  • 删除字符串
    语法一:${变量名#删除的字符串 正则 表达式}
    作用:从字符串开头(左边)开始匹配要删除的字符串
$result=${name#z}  // name="zhangsan" 
// $result=${name#a}删除失败
echo $result
// 说明:只有当 删除的字符串符合name字符串开头才能被删除

// 查找指定字符串,删除前面所有字符,包括自身
result=${name#*s} // 输出 an

// 制定删除范围,并且开始范围与原字符串匹配,否则无效
result=${name#z*s} // 输出an
result=${string#h*s} // 无效

语法二:${变量名##删除字符串 正则表达式}
作用:从字符串结尾(右边)开始匹配要删除字符串

result=${string##*g}
echo $result // 输出san

语法一和语法二都是从左边删除到右边,查找方向不一样‘

语法三:${变量名%删除字符串 正则表达式}

// 从字符串结尾开始匹配,删除匹配的字符串
result=${name%n}
echo $result

// 查找指定字符第一个位置,并且删除前面所有字符(包含自己)
#result=${name%g*}
echo $result // 输出 zhan

语法四:${变量名%%删除字符串 正则表达式}

// 查找指定字符最后一个,并且删除后面所有的字符(包含自己)
result=${name%%g*}
echo $result // 输出zhan


总结:
从左边删除到右边
#  表示查找方向从做到右
## 表示查找方向从右到左

从右边删除到左边
%   表示查找方向从右边到左边
%%  表示查找方向从左边到右边

echo命令

输出普通字符串
echo "study shell"
显示转义字符串
echo " "study shell " hello"
显示换行 -e:开启转义功能
echo -e "hello \n zhangsan"
不换行 -e 开启转义功能,\c 表示不换行
echo -e "hello zhangsan \c"
echo "is dog"
// 输出 hello zhangsan is dog

数组

// 定义一个数组
array=("zhangsan" "lishi" "wangwu")
// 输出 默认打印第一个元素
echo $array
echo ${array[2]} // 打印第二个元素
输出数组所有元素
echo ${array[@]}
// 获取数组长度
echo ${#array[*]}
// 获取单个元素的长度,下标为2的元素的长度
echo ${#array[2]}

多行注释

:<<EOF
    注释内容...
    注释内容...
    注释内容...
EOF

EOF也可以由其他字符代替

流程控制

// if
name="zhansan"
if [ $name ]
then
    echo "不为空"
fi

// if else
if [ $name ]
then
    echo "不为空"
else
    echo "空"
fi

// if else if else
a=32
b=2
if [ $a == $b ]
then
    echo "a = b"
elif [ $a > $b ]
then
    echo "a > b"
else
    echo "a < b"
fi

// for
for i in 1 3 4 6
do
    echo $i
done

// while
a=5
while(($a>0))
do
    echo $a
    a=`expr $a - 1`
done

// case
a=3
case $a in
1) echo "a = 1";;
2) echo "a = 2";;
3) echo "a = 3";;
esac;

运算符

  • 基本运算符
// + - * / % = ==
// expr 是规定命令
a=22
b=2
c=`expr $a + $b`
d=`expr $a / $b`
e=`expr $a \* $b`
echo $c
echo $d
echo $e
  • 关系运算符
-eq 检测两个数是否相等,相等返回true
-ne 检测两个数是否相等,不相等返回true
-qt 大于
-lt 小于
-ge 大于等于
-le 小于等于
a=32
b=3
if [ $a -eq $b ]
then
    echo "a等于b"
else
    echo "a不等于b"
fi
  • 布尔运算符
    !: 非
    -o: 或
    -a: 与

  • 逻辑运算符
    &&: 逻辑与
    ||: 逻辑或

    扫描二维码关注公众号,回复: 3737985 查看本文章
  • 字符串运算符

=:          检测两个字符串是否相等
!=:         检测两个字符串是否不等
-z:         检测字符串长度是否为零 为零 返回true
-n:         检测字符串长度是否为零 不为零 返回true
"字符串":    检测字符串长度是否为空。非空 true

name="zhansan"
if [ -z $name ]
then
    echo "字符串长度为零"
else
    echo "不为零"
fi
  • 文件测试运算符
file="/Users/mac/Desktop/shell学习/shellStudy.sh"
-d file:检测文件是否为一个目录,是,返回true
-r file:检测文件是否可读,是,返回true
-w file:检测文件是否可写,是,返回true
-x file:检测文件是否可执行,是,返回true
-f file:检测文件是否是一个普通文件(既不是目录,也不是目录文件),是返回true
-s file:检测文件是否为空,是,返回true
-e file:检测文件是否存在(包括目录),是,返回true

文件包含

语法一:
./testA.sh
语法二:
source ./testA.sh

cat命令

作用:
1、查看文件内容
2、连接文件
3、创建一个文件或者多个文件
4、重定向输出到终端
5、重定向到文件

1、查看文件内容
cat testA.sh
2、cat -n file.sh  -n可以显示文件内容和行号
cat -n testA.sh
-b  只标记非空白行号
cat -b testA.sh

read 命令

作用:用于获取用户输入

方法一:
echo "请输入你的名字:"
read name
echo "你的名字是:${name}"

方法二:
read -p "请输入你的名字:" name
echo "你的名字是: ${name}"

超时输入,规定时间内没有输入
if read -t 6 -p "请输入你的名字" name
then
    echo "你的名字是: ${name}"
else
    echo "超时"
fi

隐藏输入内容 -s 类似于隐藏密码
read -s -p "请输入你的密码:" password
echo "密码是:${password}"

从文件里面读取内容
cat testA.sh | while read line
do
    echo "内容为:${line}"
doen

printf命令

格式:printf format-string [arguments…]

printf 和 echo 的区别
printf 不会换行,一般用于格式打印
echo 自动换行,用于标准输出

%s %c %d %f都是格式替代符
%-10s 指一个宽度为10个字符(-表示左对齐,没有则表示右对齐),任何字符都会被显示在10个字符宽的字符内,如果不足则自动以空格填充,超过也会将内容全部显示出来。
%-4.2f 指格式化为小数,其中.2指保留2位小数

printf "%-10s %-8s %-4s \n" 姓名 性别 体重kg
printf "%-10s %-8s %-4.2f \n" Andy 男 64.232
printf "%-10s %-8s %-4s \n" jar 男 65
printf "%-10s %-8s %-4s \n" 帅牛哥 男 100

函数

函数返回值在调用该函数后通过 $? 来获得
注意:所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

function add() {
    read -p "请输入第一个参数:" arg1
    echo "参数一 = ${arg1}"
    read -p "请输入第二个参数:" arg2
    echo "参数二 = ${arg2}"
    return `expr $arg1 + $arg2`
}

add
echo "结果为 = ${?}"

重定向

命令 说明
Command > file 将输出重定向到file,替换file中的内容
Command < file 将输入重定向到file
Command >> file 将输出以追加的方式重定向到file
n > file 将文件描述符为 n 的文件重定向到file
n >> file 将文件描述符为 n 的文件以追加的方式重定向到file
n >& m 将输出文件 m 和 n 合并
n <& m 将输入文件 m 和 n 合并
<< tag 将开始标记 tag 和结束标记 tag 之间的内容作为输入

需要注意的是文件描述符 0 通常是标准输入(STDIN),1 是标准输出(STDOUT),2 是标准错误输出(STDERR)。

  • 只重定向错误
将STDERR文件描述修改为2
ls -al testFileA.sh 2> error.sh
error.sh 内容 ls: testFileA.sh: No such file or directory

将STDOUT和STDERR结合使用
ls -al testFileA.sh testFileB.sh 2> error.sh
  • 重定向错误和数据
1>” 和“2>” 结合使用 (testFileB.sh文件存在,testFileA.sh文件不存在)
目的:将数据重定向到testData.sh中 和 错误信息重定向到error.sh
ls -al testFileB.sh testFileA.sh 2> error.sh 1> testData.sh

将数据和错误信息同属输出到同一个文件中
ls -al testFileB.sh testFileA.sh &> error.sh
  • 重定向 “&”
echo "这句话定义为错误信息" >&2
echo "测试临时重定向"
执行:./shellStudy4.sh 2> error.sh 
控制台打印 测试临时重定向,error中数据为:这句话定义为错误信息
  • exec: 批量输出
// 把hello  world 全部重定向到testFileB.sh 中
exec 1> ./testFileB.sh
echo "hello"
echo "world"

// 错误信息批量保存在error.sh中,正确的信息批量保存在testFileB.sh中
exec 1> ./testFileB.sh
echo "正确的信息1"
echo "正确的信息2"
exec 2> ./error.sh
echo "错误的信息1" >&2
echo "开始测试"

// 从一个文件中testFileB.sh读取内容打印到控制台
exec 0<testFileB.sh
    count=1
    while read line
    do
    echo "当前行数:${count} 内容: ${line}"
    count=`expr $count + 1`
done


// 创建自己的重定向
自定义输出文件描述  exec
exec 22>testData.sh
echo "测试自定义文件描述"
echo "输出数据">&22
echo "结束"

// 恢复原始文件描述
exec 3>&1
exec 1>testFileB.sh
echo "测试信息"
exec 1>&3
echo "结束"

// 创建读写文件描述符
exec 3<>testFileB.sh
read line <&3
echo "read : $line"
echo "测试" >&3
// 注意:替换了第二行?因为我们文件指针读取完了第一行,文件指针指向了第二行,所以第二行之后所有的内容被替换
  • /dev/null
阻止命令输出
ls -al > /dev/null
清空文件
cat /dev/null > testFileB.sh
  • tee
记录消息:将输出同时发送显示器和日志文件,这个时候你可以采用重定向两次,才可以实现,现在我才用tee命令一步实现
1、打印到控制台,并写入文件,覆盖
date | tee testFileB.sh
2、打印到控制台,并写入文件,追加
date | tee -a testFileB.sh

猜你喜欢

转载自blog.csdn.net/wj610671226/article/details/81368597
今日推荐