Shell脚本学习

#! 告诉系统其后路径所指定的程序即是解释此脚本文件的 Shell 程序。

新建.sh文件   touch stntest.sh

#!/bin/bash

1.作为可执行程序执行脚本

chmod +x ./test.sh    使得脚本具有可以执行的权限

可以将shell脚本保存成.sh文件,保存后可以进行执行  ./test.sh

2.作为解释器参数执行脚本

sh  test.sh

 

使用变量

your_name="qinjx"
echo $your_name
echo ${your_name}

已经被定义的变量,可以重新被定义

只读变量:使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变

readonly your_name

删除变量

使用 unset 命令可以删除变量。语法:unset variable_name

变量被删除后不能再次使用。unset 命令不能删除只读变量

变量类型

运行shell时,会同时存在三种变量:

  • 1) 局部变量 局部变量在脚本或命令中定义,仅在当前shell实例中有效,其他shell启动的程序不能访问局部变量。
  • 2) 环境变量 所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。必要的时候shell脚本也可以定义环境变量。
  • 3) shell变量 shell变量是由shell程序设置的特殊变量。shell变量中有一部分是环境变量,有一部分是局部变量,这些变量保证了shell的正常运行

Shell 字符串

单引号

str='this is a string'

双引号

your_name='runoob'
str="Hello, I know you are \"$your_name\"! \n"
echo -e $str

双引号的优点:

  • 双引号里可以有变量
  • 双引号里可以出现转义字符

获取字符串长度

string="abcd"
echo ${#string} #输出 

提取子字符串

以下实例从字符串第 2 个字符开始截取 4 个字符:

string="runoob is a great site"
echo ${string:1:4} # 输出 unoo

查找子字符串

查找字符 i 或 o 的位置(哪个字母先出现就计算哪个):

string="runoob is a great site"
echo `expr index "$string" io`  # 输出 4

 以上脚本中 ` 是反引号,而不是单引号 ',不要看错了哦。

Shell 数组

bash支持一维数组(不支持多维数组),并且没有限定数组的大小。

类似于 C 语言,数组元素的下标由 0 开始编号。获取数组中的元素要利用下标,下标可以是整数或算术表达式,其值应大于或等于 0。

定义数组:array_name=(value0 value1 value2 value3) or array_name[0]=value0   array_name[1]=value1    array_name[n]=valuen

读取数组

${数组名[下标]}
valuen=${array_name[n]}

获取数组的长度

# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}

多行注释

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

Shell 传递参数

我们可以在执行 Shell 脚本时,向脚本传递参数,脚本内获取参数的格式为:$nn 代表一个数字,1 为执行脚本的第一个参数,2 为执行脚本的第二个参数,以此类推…… $0 为执行的文件名:

#!/bin/bash
# author:菜鸟教程
# url:www.runoob.com

echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
将以上脚本存为test.sh文件
$ chmod +x test.sh 
$ ./test.sh 1 2 3
输出结果:
Shell 传递参数实例!
执行的文件名:./test.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

#/bin/bash
echo "This is for test"
echo "这是该文件的文件名 $0"
echo "这是输入的第一个参数 $1"
echo "这是输入的第二个参数 $2"
echo "这是传递到脚本的参数个数 $#"
echo "传参按照字符串形式输出 $*"
echo "这是脚本当前运行的进程号 $$"
echo "这是后台运行的进程号 $!"
echo "这是显示最后命令的退出状态 $?"

 $?   获取上一个命令的退出状态 or 获取函数的返回值

 

Shell 基本运算符

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。例如,两个数相加(注意使用的是反引号 ` 而不是单引号 '):

#!/bin/bash

val=`expr 2 + 2`
echo "两数之和为 : $val"

表达式和运算符之间要有空格,例如 2+2 是不对的,必须写成 2 + 2,这与我们熟悉的大多数编程语言不一样。

完整的表达式要被 ` ` 包含,注意这个字符不是常用的单引号,在 Esc 键下边。

乘法 `expr $a \* $b`   除法`expr $b / $a`   取余 `expr $b % $a`  赋值a=$b  比较[ $a == $b ]  返回true或false

注意:条件表达式要放在方括号之间,并且要有空格,例如: [$a==$b] 是错误的,必须写成 [ $a == $b ]

乘号(*)前边必须加反斜杠(\)才能实现乘法运算;

关系运算符

-eq 判断是否相等

-ne判断是否不相等

-gt 判断左面的数是否大于右面的

-lt 判断左面的数是否小于右面的

-ge 判断左面的数是否大于等于右面的

-le 判断左面的数是否小于等于右面的

布尔运算符

!非运算

-o 或运算

-a 与运算

逻辑运算符

&& 逻辑的AND
|| 逻辑的OR

字符串运算符

=判断 两个字符串是否相等

-z 判断字符串长度是否为0

-n 判断字符串长度是否不为0

$ 判断字符串是否为空

显示变量

read 命令从标准输入中读取一行,并把输入行的每个字段的值指定给 shell 变量

#!/bin/sh
read name 
echo "$name It is a test"
输出
[root@www ~]# sh test.sh
OK                     #标准输入
OK It is a test        #输出

显示换行/不换行

\n换行  \c不换行

显示结果定向至文件

echo  "it is a test" >myfile.log
将查询结果导出至文件中

grep -E '1805|1905' CloudPayment.log > out.log

cat CloudPayment.log | grep "1805"  | grep "1905"  > out.log

 符号“>”表示擦除后写入文档  ; “>>”表示追加到文档

输出文件后将文件下载  sz filename  文件路径:C:\Users\songtianning\Downloads

显示命令执行结果

echo `date`

注意:显示时间时候会与实际时间相差8小时,所以要先设置时区   export TZ='CST-8'

Shell printf 命令

printf 命令的语法:format-string: 为格式控制字符串  arguments: 为参数列表

printf  format-string  [arguments...]
printf "%-10s %-8s %-4s\n" 姓名 性别 体重kg  
printf "%-10s %-8s %-4.2f\n" 郭靖  66.1234 
printf "%-10s %-8s %-4.2f\n" 杨过  48.6543

%-10s 指一个宽度为10个字符

%-4.2f 指格式化为小数,其中.2指保留2位小数。

Shell test 命令

Shell中的 test 命令用于检查某个条件是否成立,它可以进行数值、字符和文件三个方面的测试。

Shell 流程控制

if [ $(ps -ef | grep -c "ssh") -gt 1 ]; then echo "true"; fi

if else-if else

if condition1
then
    command1
elif condition2 
then 
    command2
else
    commandN
fi

if else语句经常与test命令结合使用,如下所示:

num1=$[2*3]
num2=$[1+5]
if test $[num1] -eq $[num2]
then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi

for 循环

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

举例
for loop in 1 2 3 4 5
do
    echo "The value is: $loop"
done

while 语句

while循环用于不断执行一系列命令,也用于从输入文件中读取数据;命令通常为测试条件。其格式为:

while condition
do
    command
done


举例
#!/bin/bash
int=1
while(( $int<=5 ))
do
    echo $int
    let "int++"
done

while循环可用于读取键盘信息。下面的例子中,输入信息被设置为变量FILM,按<Ctrl-D>结束循环。

echo '按下 <CTRL-D> 退出'
echo -n '输入你最喜欢的网站名: '
while read FILM
do
    echo "是的!$FILM 是一个好网站"
done

until 循环

until 循环执行一系列命令直至条件为 true 时停止。

until 循环与 while 循环在处理方式上刚好相反。

一般 while 循环优于 until 循环,但在某些时候—也只是极少数情况下,until 循环更加有用。

case

Shell case语句为多选择语句。可以用case语句匹配一个值与一个模式,如果匹配成功,执行相匹配的命令。case语句格式如下:

case  in
模式1)
    command1
    command2
    ...
    commandN
    ;;
模式2
    command1
    command2
    ...
    commandN
    ;;
esac

case工作方式如上所示。取值后面必须为单词in,每一模式必须以右括号结束。取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。

取值将检测匹配的每一个模式。一旦模式匹配,则执行完匹配模式相应命令后不再继续其他模式。如果无一匹配模式,使用星号 * 捕获该值,再执行后面的命令。

实例:

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

Shell 函数

shell中函数的定义格式如下:

[ function ] funname [()]

{

    action;

    [return int;]

}

说明:

  • 1、可以带function fun() 定义,也可以直接fun() 定义,不带任何参数。
  • 2、参数返回,可以显示加:return 返回,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255

所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至shell解释器首次发现它时,才可以使用。调用函数仅使用其函数名即可。

函数参数

在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
注意,$10 不能获取第十个参数,获取第十个参数需要${10}。当n>=10时,需要使用${n}来获取参数
$#传递到脚本或函数的参数个数
$*以一个单字符串显示所有向脚本传递的参数
$?显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。获取函数的返回值

$ wc -l << EOF 欢迎来到 菜鸟教程 www.runoob.com EOF 3 # 输出结果为 3 行 $

Shell 文件包含

和其他语言一样,Shell 也可以包含外部脚本。这样可以很方便的封装一些公用的代码作为一个独立的文件。

Shell 文件包含的语法格式如下:

. filename   # 注意点号(.)和文件名中间有一空格



source filename

创建两个 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"

 

posted @ 2020-04-09 16:07  stnnnn123  阅读(186)  评论(0)    收藏  举报