linux shell脚本基础知识

参考:linux shell脚本基础知识

Table of Contents

1、用户自定义变量

1.1变量赋值:

1.2, 将一个命令的执行结果赋给变量

1.3变量叠加

1.4、列出所有的变量:

1.5、删除变量:

2、环境变量

3、位置参数变量

3.1、shift指令:

3.2、shell中$* 和$@的区别

4、预定义变量

5、read命令

6、运算符

7、$()与${}的区别

8、条件测试

8.1、内置test命令

8.2、字符串测试:

8.3、整数测试:

8.4、多重条件测试:

9、case命令


 

1、用户自定义变量


1.1变量赋值:

1,定义时赋值:

变量=值

等号两侧不能有空格

eg:

STR="hello world"

A=9

1.2, 将一个命令的执行结果赋给变量

A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A

A=$(ls -la) 等价于反引号

eg: aa=$((4+5))

bb=`expr 4 + 5 `

1.3变量叠加

eg:#aa=123

eg:#cc="$aa"456

eg:#dd=${aa}789

linux shell脚本基础知识_第1张图片

单引号和双引号的区别:

现象:单引号里的内容会  全部输出,而双引号里的内容会有变化

原因:单引号会将所有特殊字符脱意

NUM=10    

SUM="$NUM hehe"     echo $SUM     输出10 hehe

SUM2='$NUM hehe'     echo $SUM2    输出$NUM hehe

1.4、列出所有的变量:

# set

1.5、删除变量:

# unset  NAME

eg :

# unset A 撤销变量 A

# readonly B=2 声明静态的变量 B=2 ,不能 unset

 

2、环境变量


用户自定义变量只在当前的shell中生效,而环境变量会在当前shell和其所有子shell中生效。如果把环境变量写入相应的配置文件,那么这个环境变量就会在所有的shell中生效。

export 变量名=变量值   

作用域:当前shell以及所有的子shell

 

3、位置参数变量


$n

n为数字,$0代表命令本身,$1-$9代表第一到第9个参数,

十以上的参数需要用大括号包含,如${10}。

$* 代表命令行中所有的参数,把所有的参数看成一个整体。以"$1 $2 … $n"的形式输出所有参数
$@ 代表命令行中的所有参数,把每个参数区分对待。以"$1" "$2" … "$n" 的形式输出所有参数
$# 代表命令行中所有参数的个数。添加到shell的参数个数

3.1、shift指令

位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1$2$3丢弃,$0不移动。不带参数的shift命令相当于shift 1

若用户要求 Shell 在不知道位置变量个数的情况下,还能逐个的把参数一一处理,也就是在 $1 后为 $2,在 $2 后面为 $3 等。在 shift 命令执行前变量 $1 的值在 shift 命令执行后就不可用了。

示例如下:

#测试 shift 命令(x_shift.sh)
until [ $# -eq 0 ]
do
echo "第一个参数为: $1 参数个数为: $#"
shift
done

执行以上程序x_shift.sh:
$./x_shift.sh 1 2 3 4

结果显示如下:

第一个参数为: 1 参数个数为: 4
第一个参数为: 2 参数个数为: 3
第一个参数为: 3 参数个数为: 2
第一个参数为: 4 参数个数为: 1

从上可知 shift 命令每执行一次,变量的个数($#)减一,而变量值提前一位,下面代码用 until 和 shift 命令计算所有命令行参数的和。

 

3.2、shell中$* 和$@的区别

参考:https://www.cnblogs.com/tele-share/p/9080069.html

#! /bin/bash
test() {
        echo "未加引号,二者相同"
        echo $*
        echo $@
        echo "加入引号后对比"
        for N in "$*"
        do
           echo $N
        done

        echo "----------"
        for N in "$@"
        do
           echo $N
        done
}
test  12 123  3424 546

linux shell脚本基础知识_第2张图片

可以看到不加引号时,二者都是返回传入的参数,但加了引号后,此时$*把参数作为一个字符串整体(单字符串)返回,$@把每个参数作为一个字符串返回

 

4、预定义变量


$? 

执行上一个命令的返回值   执行成功,返回0,执行失败,返回非0(具体数字由命令决定)

$$

当前进程的进程号(PID),即当前脚本执行时生成的进程号

$!

后台运行的最后一个进程的进程号(PID),最近一个被放入后台执行的进程   &

# vi pre.sh

pwd >/dev/null

echo $$

 

ls /etc  >/dev/null &

echo $!

 linux shell脚本基础知识_第3张图片

Linux文件默认是没有x权限的 而文件是有的

 linux shell脚本基础知识_第4张图片

 

5、read命令


read [选项] 值

read -p(提示语句) -n(字符个数) -t(等待时间,单位为秒) –s(隐藏输入)   对应密码那些输入

eg:

read –t 30 –p “please input your name: ” NAME

echo $NAME

read –s –p “please input your age : ” AGE

echo $AGE

read –n 1 –p “please input your sex  [M/F]: ” GENDER

echo $GENDER

按住Ctrl +退格 才可以退

6、运算符


num1=11

num2=22

sum=$num1+$num2

echo $sum

格式 :expr m + n 或$((m+n)) 注意expr运算符间要有空格

expr命令:对整数型变量进行算术运算

(注意:运算符前后必须要有空格) 

expr 3 + 5   
expr 3 – 5

echo `expr 10 / 3`            

10/3的结果为3,因为是取整
expr  3 \* 10    

\ 是转义符

计算(2 +3 )×4 的值

1 .分步计算
       S=`expr 2 + 3`
       expr $S \* 4

2.一步完成计算

       expr `expr 2 + 3` \* 4

       S=`expr \`expr 2 + 3\`  \* 4`  

       echo $S

       或

        echo $(((2 + 3) * 4))

 

7、$()与${}的区别


$( )的用途和反引号``一样,用来表示优先执行的命令

eg:echo $(ls a.txt)

${ } 就是取变量了  eg:echo ${PATH}

$((运算内容)) 适用于数值运算

eg: echo $((3+1*4))

 

8、条件测试


8.1、内置test命令

内置test命令常用操作符号[]表示,将表达式写在[]中,如下:

[ expression ]    注意空格

或者:

test expression

注意expression首尾都有个空格

eg: [  ] ;echo $?

测试范围:整数、字符串、文件

表达式的结果为真,则test的返回值为0,否则为非0。

当表达式的结果为真时,则变量$?的值就为0,否则为非0

 

8.2、字符串测试:

test  str1 == str2    测试字符串是否相等 =

test  str1 != str2    测试字符串是否不相等
test  str1            测试字符串是否不为空,不为空,true,false
test  -n str1     测试字符串是否不为空  注意str1加双引号和不加的区别
test  -z  str1    测试字符串是否为空

eg:

name=linzhiling

[ “$name” ] && echo ok

; 命令连接符号

&& 逻辑与 条件满足,才执行后面的语句

[ -z “$name” ] && echo  invalid  || echo ok

||  逻辑或,条件不满足,才执行后面的语句

test “$name” == ”yangmi” && echo ok  || echo  invalid

 

8.3、整数测试:

test   int1 -eq  int2    测试整数是否相等 equals
test   int1 -ge  int2    测试int1是否>=int2
test   int1 -gt  int2    测试int1是否>int2
test   int1 -le  int2    测试int1是否<=int2
test   int1 -lt  int2    测试int1是否 test   int1 -ne  int2    测试整数是否不相等

eg:

test 100 –gt 100

test 100 –ge 100

如下示例两个变量值的大小比较:

 linux shell脚本基础知识_第5张图片

-gt表示greater than大于的意思,-le表示less equal表示小于等于。

 

 

文件测试:

test  -d  file ;echo $?  指定文件是否目录

test  –e  file ;echo $?    文件是否存在 exists
test  -f  file  ;echo $?   指定文件是否常规文件
test –L File   ;echo $?  文件存在并且是一个符号链接 


test  -r  file    指定文件是否可读
test  -w  file    指定文件是否可写

test  -x  file    指定文件是否可执行

eg:

test -d  install.log

test –r install.log

test –f xx.log ; echo $?

[ -L service.soft  ] && echo “is a link”

test -L /bin/sh ;echo $?

[ -f /root ] && echo “yes” || echo “no”

8.4、多重条件测试:

条件1 –a 条件2 逻辑与  两个都成立,则为真

条件1 –o 条件2 逻辑或   只要有一个为真,则为真

! 条件                逻辑非    取反

eg:

num=520

[ -n “$num” –a “$num” –ge 520 ] && echo “marry you” || echo “go on”

age=20

pathname=outlog

[ ! -d“$ pathname”] &&  echo usable || echo  used

 

9、case命令


case变量的值用来匹配value1,value2,value3等等。匹配到后则执行跟在后面的命令直到遇到双分号为止(;;)case命令以esac作为终止符

#!/bin/bash

case $1 in

start)

echo "starting"
;;

Stop)

echo "stoping"
;;

*)

echo "Usage: {start|stop}"

esac

 

 

 

 

 

 

 

你可能感兴趣的:(linux)