shell脚本知识大全

#!/usr/bin/env bash

# 定义变量
your_name="linzhaopo"
# 引用变量
echo ${your_name}
# 只读变量
readonly your_name

myCompany="kailashtech"
# unset 可以删除变量,语法,不能删除只读变量
unset ${myCompany}
# 运行shell是存在3种变量:
# 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
# 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
# 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

#  Shell 字符串
#  字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串可以用单引号,也可以用双引号,也可以不用引号。单双引号的区别跟PHP类似。
str='this is a string'
echo ${str}
#       单引号字符串的限制:
#                单引号里的任何字符都会原样输出,单引号字符串中的变量是无效的;
#                单引号字串中不能出现单独一个的单引号(对单引号使用转义符后也不行),但可成对出现,作为字符串拼接使用。
hisName="liuxiang"
str2="hello I know his name is \"${hisName}\"  \n"
echo -e ${str}
#       双引号的优点:
#                 双引号里可以有变量
#                 双引号里可以出现转义字符

# 拼接字符串
myName="runoob"
# 使用双引号拼接
greeting="hello , "${myName}" !"
greeting2="hello , ${myName}"
echo ${greeting} ${greeting2}
# 使用单引号拼接
greeting3='hello ,'${myName}''
greeting4='hello ${myName}'
echo ${greeting3} ${greeting4}

# 获取字符串长度
echo ${#myName}

# 提取子字符串
echo ${myName:1:3} # 从第一个字符开始,截取3个字符

# 查找子字符串
# 查找字符i或o的位置(哪个字符先出现就先计算哪个)
string="runoob is a greet site"
echo `expr index "${string}" io`   # 注意使用的是反引号,不是单引号哦!

# shell数组
# bash支持一维数组(不支持多维数组),并且没有限定数组的大小 ,下标从0开始
array_name=(1 2 3 4 5)
    echo ${array_name[1]}
# 使用@符号可以获取数组中的所有元素
echo ${array_name[@]}

# 获取数组的长度,和获取字符串长度的方法类似
length=${array_name[@]}  length=${array_name[*]}   # 数组个数
lengthn=${#array_name[2]}  # 获取单个数组元素的长度

# shell注释
# 以#开头
# 临时注释:把一段代码用花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
# 多行注释格式:
:<< EOF
注释内容...
注释内容...
注释内容...
注释内容...
EOF

# EOF还可以使用其他格式 '或 !


# shell传递参数:在执行shell脚本时,向脚本传递参数,
# 脚本内获取参数的格式是:$n. n代表一个数字,1为执行脚本的第一个参数,2为执行脚本的第二个参数,以此类推
echo "shell传参实例"

# shell基本运算符:支持算数运算符、关系运算符、布尔运算符、字符串运算符、文件测试运算符
# 原生的bash不支持简单的数学运算,但是可以通过其他的命令来实现:awk和expr,expr最常见
# expr是一款表达式计算工具,使用它可以完成表达式的求值操作。
val=`expr 2 + 2`
echo "$val"
# 注意俩点:1. 表达式与运算符之间要有空格,例如2+2这是不对的,必须要写成2 + 2
#           2. 完整的表达式要被``包含,注意这个字符不是常用的单引号,在esc下边
# 算数运算符:其中的加、减、乘、除和上面的例子一样,条件表达式==和!=要放在[]之间,并且要有空格,例如:[ $a == $b ] 不能写成[$a==$b]
a=10
b=20
val=`expr $a + $b`
echo "a+b的值是:${val}"

val=`expr $a - $b`
echo "a-b的值是:${val}"

val=`expr $a \* $b`
echo "a*b的值是:${val}"

val=`expr $a / $b`
echo "a/b的值是:${val}"

val=`expr $a % $b`
echo "a%b的值是:${val}"

if [ $a == $b ]
 then
    echo "a==b"
fi

if [ $a != $b ]
then
    echo "a!=b"
fi

# 关系运算符
# 关系运算符只支持数字,不支持字符串,除非字符串的值是数字
#  -eq  检测两个数是否相等,相等返回 true。                  [ $a -eq $b ] 返回 false。
#  -ne  检测两个数是否不相等,不相等返回 true。                [ $a -ne $b ] 返回 true。
#  -gt  检测左边的数是否大于右边的,如果是,则返回 true。       [ $a -gt $b ] 返回 false。
#  -lt  检测左边的数是否小于右边的,如果是,则返回 true。       [ $a -lt $b ] 返回 true。
#  -ge  检测左边的数是否大于等于右边的,如果是,则返回 true。 [ $a -ge $b ] 返回 false。
#  -le  检测左边的数是否小于等于右边的,如果是,则返回 true。 [ $a -le $b ] 返回 true。

# 逻辑运输符
#  运算符 说明         举例
#  &&      逻辑的 AND    [[ $a -lt 100 && $b -gt 100 ]] 返回 false
#  ||      逻辑的 OR [[ $a -lt 100 || $b -gt 100 ]] 返回 true


# shell的echo命令:用于字符串输出。也可以使用echo 实现更复杂的输出格式控制:如显示普通字符串和显示转义字符
# 显示变量:read命令从标准输入中读取一行,并把输入行的每个字段的值指定给shel变量
read name
echo "${name} it is a test"
# 显示结果定向至文件
echo "it is a test" > myfile

# 显示命令执行结果
echo `date`

# 流程控制
a=10
b=20
if [ $a == $b ]; then
    echo "a等于b"
    elif [ $a -gt $b ]
    then
    echo "a>b"
    elif [ $a -lt $b ]
    then
    echo "a 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)。


# 重定向深入讲解,一般情况下每个shell命令运行时都会打开3个文件
# 标准输入文件(stdin):stdin文件描述符为0,unix程序默认从stdin读取数据
# 标准输出文件(stdout):stdout文件描述符1,Unix程序默认行啊stdoutshuchu数据
# 标准错误文件(stderr):stderr文件描述符为2,unix会想stderr流写入错误信息

# here document :是shell中的一种特殊的重定向方式,用来将输入重定向到一个交互式shell脚本或程序
# 格式
command << delimiter
    document
delimiter
# 它的作用是将两个 delimiter 之间的内容(document) 作为输入传递给 command。
# 注意:
# 结尾的delimiter 一定要顶格写,前面不能有任何字符,后面也不能有任何字符,包括空格和 tab 缩进。
# 开始的delimiter前后的空格会被忽略掉。

# /dev/null文件
# 如果希望之星某条命令,但又不希望在屏幕上显示结果,把么可以重定向到/dev/null

# shell文件包含
# 可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。
# Shell 文件包含的语法格式如下:
#test1.sh 代码如下:
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

url="http://www.runoob.com"
#test2.sh 代码如下:
#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

#使用 . 号来引用test1.sh 文件
. ./test1.sh

# 或者使用以下包含文件代码
# source ./test1.sh

echo "菜鸟教程官网地址:$url"
#接下来,我们为 test2.sh 添加可执行权限并执行:
#$ chmod +x test2.sh
#$ ./test2.sh
#菜鸟教程官网地址:http://www.runoob.com
#注:被包含的文件 test1.sh 不需要可执行权限。

你可能感兴趣的:(shell)