Linux基础回顾--shell脚本编程知识点大全(4)

当时才开始学shell脚本时,感觉好多语法要记,写起来也是很繁琐,再次回顾之前的知识,发现掌握好基础才是关键,才能更高效快速的写出想要的脚本,下面就简单介绍一下shell的基础知识

shell变量

变量赋值:
1,定义时赋值:

变量=值 
等号两侧不能有空格
eg:
STR="hello world"
A=9

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

A=`ls -la` 反引号,运行里面的命令,并把结果返回给变量A
A=$(ls -la) 等价于反引号
eg: aa=$((4+5))
bb=`expr 4 + 5 `

3,将一个变量赋给另一个变量

eg : A=$STR
变量叠加
eg:#aa=123
eg:#cc="$aa"456
eg:#dd=${aa}789

单引号和双引号的区别:
现象:单引号里的内容会全部输出,而双引号里的内容会有变化
原因:单引号会将所有特殊字符脱意

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

列出所有的变量:

# set 

删除变量:

# unset  NAME

eg :

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

用户自定义的变量,作用域为当前的shell环境。

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

export 变量名=变量值   申明变量

作用域:当前shell以及所有的子shell
位置参数变量

$n	n为数字,$0代表命令本身,$1-$9代表第一到第9个参数,
十以上的参数需要用大括号包含,如${10}。
$*	代表命令行中所有的参数,把所有的参数看成一个整体。以"$1 $2 … $n"的形式输出所有参数
$@	代表命令行中的所有参数,把每个参数区分对待。以"$1" "$2" … "$n" 的形式输出所有参数
$#	代表命令行中所有参数的个数。添加到shell的参数个数

shift指令:参数左移,每执行一次,参数序列顺次左移一个位置,$# 的值减1,用于分别处理每个参数,移出去的参数不再可用

$* 和 $@的区别
$* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号" "包含时,都以"$1" "$2" … "$n" 的形式输出所有参数
当它们被双引号" "包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数

shell脚本中执行测试:
在这里插入图片描述
输出结果:
在这里插入图片描述

预定义变量

$? 	执行上一个命令的返回值   执行成功,返回0,执行失败,返回非0(具体数字由命令决定)
$$	当前进程的进程号(PID),即当前脚本执行时生成的进程号
$!	后台运行的最后一个进程的进程号(PID),最近一个被放入后台执行的进程   &

# vi pre.sh
pwd >/dev/null
echo $$

ls /etc  >/dev/null &
echo $!

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

运算符

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))

( ) 与 ()与 (){}的区别

$( )的用途和反引号``一样,用来表示优先执行的命令
eg:echo $(ls a.txt)
${ } 就是取变量了  eg:echo ${PATH}
$((运算内容)) 适用于数值运算
eg: echo $((3+1*4))

条件测试

内置test命令
内置test命令常用操作符号[]表示,将表达式写在[]中,如下:
[ expression ]  
或者:
test expression 
注意:expression首尾都有个空格
eg: [  ] ;echo $?
测试范围:整数、字符串、文件
表达式的结果为真,则test的返回值为0,否则为非0。
当表达式的结果为真时,则变量$?的值就为0,否则为非0

字符串测试:

test  str1 == str2    测试字符串是否相等 = 
test  str1 != str2    测试字符串是否不相等
test  str1            测试字符串是否不为空,不为空,true,false
test  -n str1     测试字符串是否不为空
test  -z  str1    测试字符串是否为空
eg:
name=linzhiling
[ “$name” ] && echo ok
; 命令连接符号
&& 逻辑与 条件满足,才执行后面的语句
[ -z “$name” ] && echo  invalid  || echo ok
||  逻辑或,条件不满足,才执行后面的语句
test “$name” == ”yangmi” && echo ok  || echo  invalid

整数测试:

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是否<int2
test   int1 -ne  int2    测试整数是否不相等
eg:
test 100 –gt 100
test 100 –ge 100
如下示例两个变量值的大小比较:
 
-gt表示greater than大于的意思,-le表示less equal表示小于等于。

文件测试:

test  -d  file      指定文件是否目录
test  –e  file     文件是否存在 exists
test  -f  file     指定文件是否常规文件
test –L File     文件存在并且是一个符号链接 

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”

多重条件测试:

条件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

流程控制语句

if/else命令
1, 单分支if条件语句

if [ 条件判断式 ]
    then
        程序
fi    
或者
if [ 条件判断式 ] ; then 
    程序
fi
eg:#!/bin/sh
if  [ -x  /etc/rc.d/init.d/httpd ]
    then
    /etc/rc.d/init.d/httpd restart
fi
单分支条件语句需要注意几个点
if语句使用fi结尾,和一般语言使用大括号结尾不同。
[ 条件判断式 ] 就是使用test命令判断,所以中括号和条件判断式之间必须有空格
then后面跟符号条件之后执行的程序,可以放在[]之后,用“;”分割,也可以换行写入,就不需要";"了。

2,多分支if条件语句

if [ 条件判断式1 ]
    then
        当条件判断式1成立时,执行程序1
elif  [ 条件判断式2 ]  
    then      
        当条件判断式2成立时,执行程序2
...省略更多条件
else
    当所有条件都不成立时,最后执行此程序
fi
示例:
read -p "please input your name: " NAME
eg:
#!/bin/bash
read -p "please input your name:"  NAME
#echo  $NAME
if [ “$NAME” == root ]
        then
                echo "hello ${NAME},  welcome !"
        elif [ $NAME == tom ]
                then
                        echo "hello ${NAME},  welcome !"
        else
                echo "SB, get out here !"
fi

case命令

case命令是一个多分支的if/else命令,case变量的值用来匹配value1,value2,value3等等。匹配到后则执行跟在后面的命令直到遇到双分号为止(;;)case命令以esac作为终止符。
格式
	CMD=$1
case $CMD in
start)
	echo "starting"
	;;
Stop)
	echo "stoping"
	;;
*)
	echo "Usage: {start|stop} “
esac

for循环

for循环命令用来在一个列表条目中执行有限次数的命令。比如,你可能会在一个姓名列表或文件列表中循环执行同个命令。for命令后紧跟一个自定义变量、一个关键字in和一个字符串列表(可以是变量)。第一次执行for循环时,字符串列表中的第一个字符串会赋值给自定义变量,然后执行循环命令,直到遇到done语句;第二次执行for循环时,会右推字符串列表中的第二个字符串给自定义变量,依次类推,直到字符串列表遍历完。
第一种:
for N in 1 2 3 
do
	echo $N
done
或
for N in 1 2 3; do echo $N; done
或
for N in {1..3}; do echo $N; done
第二种:
for ((i = 0; i <= 5; i++))
do
	echo "welcome $i times"
done
或
for ((i = 0; i <= 5; i++)); do echo "welcome $i times"; done
练习:计算从1到100的加和。

while循环

while命令根据紧跟其后的命令(command)来判断是否执行while循环,当command执行后的返回值(exit status)为0时,则执行while循环语句块,直到遇到done语句,然后再返回到while命令,判断command的返回值,当得打返回值为非0时,则终止while循环。
第一种
while expression
do
command
…
done

自定义函数

函数代表着一个或一组命令的集合,表示一个功能模块,常用于模块化编程。
以下是关于函数的一些重要说明:	
在shell中,函数必须先定义,再调用
使用return value来获取函数的返回值
函数在当前shell中执行,可以使用脚本中的变量。
函数的格式如下:
函数名()
{
命令1…..
命令2….
return 返回值变量
}
[ function ] funname [()]
{
  action;
  [return int;]
}
function start()  / function start  / start()
eg:
 
注意:
如果函数名后没有(),在函数名和{ 之间,必须要有空格以示区分。
函数返回值,只能通过$? 系统变量获得,可以显示加:return 返回值,如果不加,将以最后一条命令运行结果,作为返回值。 return后跟数值n(0-255)

以上为常用的shell编程基础知识及语法知识,工作中工作尽量实现自动化脚本,提高工作效率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值