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<b"
    else
    echo "没有符合条件的"
fi

for loop in 1 2 3 4 5
do
    echo "the value is $loop"
done
int=1
while (( $int<=5 ))
 do
 echo "$int"
 let "int++"
 done
# 上面使用了let命令,它用于执行一个或多个表达式,变量计算不需要$来表示变量
# while循环变量可用于读取键盘信息,下面的例子中输入信息被设置为变量FLIM,按ctrl-d结束循环
echo '按下ctrl-d 退出'
echo -n '输入你最喜欢的网站名'
while read FLIN;
do
    echo "是的!$FLIN 是一个好网站"
done

# 无线循环
while :
do
 command
 done
# 或者
while true
do
command
done

# 或者
# for (( ; ; ))


# until循环:循环执行一些列命令直至条件为true时停止。
# until循环与while循环在处理方式上刚好相反。while循环由于until循环,极少数情况下until循环更加有用

# case. shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相关的命令
echo '输入1到4之间的数字'
echo '你输入的数字为:'
read aNum
case ${aNum} in
  1) echo '你选择了1'
     ;;
  2) echo '你选择了2'
      ;;
  3) echo '你选择了3'
      ;;
  4) echo '你选择了4'
      ;;
  *) echo '你没有输入1到4的数字'
      ;;
  esac

# 跳出循环,break 和continue 作用和java的一样

# esac(case反过来)作为结束标记,每个case的分支有右圆括号表示,2个;;表示break

# shell函数
demoFun(){
echo '这是我的第一个shell函数'
}

funWithReturn(){
    echo "这个函数会对输入的数字进行相加梳理"
    echo "输入第一个数"
    read aNum
    echo "输入第二个数"
    read anotherNum
    echo "俩个数字分别为${aNum} ${anotherNum}"
    return $(($aNum+$anotherNum))
}

funWithReturn
echo "输入的2数之和为$?"
# 函数返回值在调用函数后通过$?获得

# 在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数...
funWithParam(){
    echo "第一个参数为 $1 !"
    echo "第二个参数为 $2 !"
    echo "第十个参数为 $10 !"
    echo "第十个参数为 ${10} !"
    echo "第十一个参数为 ${11} !"
    echo "参数总数有 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
funWithParam 1 2 3 4 5 6 7 8 9 34 73

# shell输入输出重定向
# command > 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 不需要可执行权限。

  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值