Shell初体验

前言:

  Shell是一个命令行解释器,它接受应用程序/用户命令,然后调用操纵系统内核.

 

Shell还是一个功能相当强大的编程语言,易编写,易调试,灵活性强.

 

一 Shell解析器

1.Linux提供的Shell解析器有:cat /etc/shells

/bin/sh

/bin/bash

/sbin/nologin

/bin/dash

/bin/tcsh

/bin/csh

2.sh和bash的关系

 

 

3.Centos默认的解析器是:

 

 

二 Shell脚本基本操作

1.脚本格式以 #!/bin/bash 开头(指定解析器)

2.给脚本赋予+x权限 : chmod 777 myshell.sh

自定义变量

1.基本语法

1)定义变量:变量= 

2)撤销变量:unset 变量

3)声明静态变量:readonly变量,注意:不能unset

2.变量定义规则

1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写

2)等号两侧不能有空格

3bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

4)变量的值如果有空格,需要使用双引号或单引号括起来。

 

特殊变量


1.基本语法:$# (功能描述:获取所有输入参数个数,常用于循环).

案例:

vi parameter.sh

#!/bin/bash
echo "$0 $1 $2"
echo $#

测试结果:

 

 

 2.  $* $@

$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)

$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)

案例:

 

vi parameter.sh

 

#!/bin/bash
echo "$0 $1 $2"
echo $#

echo $@

echo $*

 

测试结果:

 

 

 

3.   $?

基本语法

$ (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

测试结果:

 

 

 

三 运算符

1.基本语法

1“$((运算式))”“$[运算式]”

2expr  + , - , \*,  /,  %    ,乘,除,取余

注意:expr运算符间要有空格

2.案例实操:

(1)计算3+2的值

[root]$ expr 2 + 3

5

(2)计算3-2的值

[root]$ expr 3 - 2

1

(3)计算(2+3X4的值

aexpr一步完成计算

[root]$ expr `expr 2 + 3` \* 4

20

b)采用$[运算式]方式

[root]# S=$[(2+3)*4]

[root]# echo $S

 

四 条件判断

 

1.基本语法

 

[ condition ]注意condition前后要有空格

 

注意:条件非空即为true[ atguigu ]返回true[] 返回false

 

2. 常用判断条件

 

1两个整数之间比较

 

= 字符串比较

 

-lt 小于(less than) -le 小于等于less equal)

 

-eq 等于(equal) -gt 大于(greater than)

 

-ge 大于等于greater equal) -ne 不等于(Not equal)

 

2按照文件权限进行判断

 

-r 有读的权限read -w 有写的权限write

 

-x 有执行的权限(execute)

 

3按照文件类型进行判断

 

-f 文件存在并且是一个常规的文件file

 

-e 文件存在(existence) -d 文件存在并是一个目录(directory)

 

案例实操

123是否大于等于22

[root]$ [ 23 -ge 22 ]

[root]$ echo $?

0

2helloworld.sh是否具有写权限

[root]$ [ -w parameter.sh ]

[root]$ echo $?

0

3/home/root/cls.txt目录中的文件是否存在

[root]$ [ -e /home/root/cls.txt ]

[root]$ echo $?

1

(4)多条件判断&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令

[root]$ [ condition ] && echo OK || echo notok

OK

[root]$ [ condition ] && [ ] || echo notok

not ok

 

五 流程控制

if 判断

1.基本语法

if [ 条件判断式 ]

  then

      程序

elif[条件判断式]

  then

    程序

fi

或者

if [ 条件判断式 ];then

  程序

elif [条件判断式]; then

 程序

fi 

注意事项:

1[ 条件判断式 ],中括号和条件判断式之间必须有空格

2if后要有空格

测试案例:

 

vi myif.sh
#!/bin/bash if [ $1 == "1" ] then echo "您输入的是1" elif [ $1 == "2" ] then echo "您输入的是2" fi

 

 

 

六 case语句

1.基本语法

case $变量名 in

  "1"

    如果变量的值等于值1,则执行程序1

    ;;

  "2"

    如果变量的值等于值2,则执行程序2

    ;;

  …省略其他分支

  *

    如果变量的值都不是以上的值,则执行此程序

    ;;

esac

注意事项:

1) case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。

2) 双分号;;”表示命令序列结束,相当于java中的break

最后的*)”表示默认模式,相当于java中的default。

 

测试:

vi mycase.sh
#!/bin/bash case $1 in "1") echo "您输入的是1" ;; "2") echo "您输入的是2" ;; "3") echo "您输入的是3" ;; *) echo "您输入的是任意值" ;; esac

结果:

 

 

七 for循环

1.基本语法1

for (( 初始值;循环控制条件;变量变化 ))

  do

    程序

  done

 

测试案例:

vi myfor.sh

#!/bin/bash s=0 for ((i=0;i<=100;i++)) do s=$[$s+$i] done echo $s

 

 2.基本语法2

for 变量 in 1 2 3…

  do

    程序

  done

测试案例:打印所有输入参数

#!/bin/bash
#打印数字
for i in $*
        do
                echo "China have beautiful citys like $i"
        done

 

 

3.比较$* 和 $@ 的区别

(a)$*$@都表示传递给函数或脚本的所有参数,不被双引号“”包含时,都以$1 $2 …$n的形式输出所有参数

vi test1.sh

#!/bin/bash 

for i in $*
do
      echo "today is $i "
done

for j in $@
do      
        echo "today is $j"
done

输出:

[root]$ sh test1.sh cls xz bd

today is cls

today is xz

today is bd

today is cls

today is xz

today is bd

(b)当它们被双引号“”包含时,“$*”会将所有的参数作为一个整体,以“$1 $2 …$n”的形式输出所有参数;“$@”会将各个参数分开,以“$1” “$2”…”$n”的形式输出所有参数

vi test2.sh

#!/bin/bash 

for i in "$*" 
#$*中的所有参数看成是一个整体,所以这个for循环只会循环一次 
        do 
                echo "tomorrow is $i"
        done 

for j in "$@" 
#$@中的每个参数都看成是独立的,所以“$@”中有几个参数,就会循环几次 
        do 
                echo "tomorrow is $j" 
done

输出:

[root]$ sh test2.sh cls xz bd

tomorrow is cls xz bd

tomorrow is cls

tomorrow is xz

tomorrow is bd


八 while循环

1.基本语法

while [ 条件判断式 ]

  do

    程序

  done

测试:

vi mywhile.sh

#!/bin/bash
s=0
i=1
while [ $i -le 100 ]
do
        s=$[$s+$i]
        i=$[$i+1]
done

echo $s

输出:

[root]$ ./mywhile.sh

5050

 

九 read读取控制台输入

1.基本语法

read(选项)(参数)

选项:

-p:指定读取值时的提示符;

-t:指定读取值时等待的时间(秒)。

参数

变量:指定读取值的变量名

案例:(提示7秒内,读取控制台输入的名称)

vi myread.sh

#!/bin/bash

read -t 7 -p "Enter your name in 7 seconds " NAME
echo $NAME

 

 

 十 函数

1.系统函数 basename基本语法

basename[string / pathname][suffix] (功能描述:basename命令会删掉所有的前缀包括最后一个("\")字符,然后将字符串显出来).

选项:suffix为后缀,如果suffix被指定了,basename会将pathname或string中的suffix去掉.

 测试:(截取/opt/module/test.txt路径的文件名称)

2.dirname基本语法

dirname绝对路径(功能描述:从给定的包含绝对路径的文件名中除去文件名(非目录部分),然后返回剩下的路径(目录部分)).

测试:

 3.自定义函数

 1.基本语法

 [ function ] funname[()]

 {

 Action;

 [return int;]

 }

 funname

 2.经验技巧

 1)必须在调用函数地方之前,先声明函数,shell脚本是逐行运行。不会像其它语言一样先编译。

 2)函数返回值,只能通过$?系统变量获得,可以显示加:return返回,如果不加,将以最后一条命令运行结果,作为返回值。return后跟数值n(0-255)

 案例:(计算两个输入参数的和)

vi myfunc.sh

#!/bin/bash
function sum()
{
    s=0
    s=$[ $1 + $2 ]
    echo "$s"
}

read -p "Please input the first number: " n1;
read -p "Please input the second number: " n2;
sum $n1 $n2;

输出:

 

 

 

 

posted @ 2021-08-20 11:30  明明就-  阅读(27)  评论(0编辑  收藏  举报