#!/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 不需要可执行权限。
shell脚本知识大全
最新推荐文章于 2022-07-16 16:00:37 发布