Linux运维:Shell编程

目录

0x01编写shell脚本:

文件创建:

最简单的shell脚本:

执行方式有两种:

#变量

赋值:

变量的访问:

单引号和双引号和php一样

字符串拼接:

获取字符串的长度:

截取字符串:

#数组:

数组定义

#输出重定向

#输入重定向

#shell 流程控制:

if

#运算符

#布尔运算符

#逻辑运算符

#文件测试运算:

#基本运算符:

#for

#while

#case

#Shell函数

函数的定义:

函数调用

#文件引入

#输出带颜色的字体:


命令行组合运用:

  • 使用分号:
    • 命令1;命令2;命令3
    • 依次执行,只有先后,没有逻辑关系

例如:

x=123;y=456;
mkdir /newdir;cd /newdir
//新建目录,再进入此目录

典型应用:

开启某个服务,并将此服务设为开机自启动

#!/bin/bash 所有脚本默认的起始行,说明下面的代码都是使用/bin/bash 这个shell文件来解释的。echo -n "IP:"  //-n参数表示,显示完字符串之后光标不换行。紧跟在字符串后面read ip  //定义一个变量ip,并从终端读取数据,相当于 var ip加上scanfecho "your ip is:"$ip

#数组:

只支持一维数组,不支持多维数组

数组定义

变量名=(value1 value2 ...) 空格分隔

1 #! /bin/bash2 username=('liudehua' 'zhangxueyou')3 echo ${username[0]}
  1 #! /bin/bash2 username[2]="guofucheng"3 echo ${username[2]}

访问数组中的所有元素:

  1 #! /bin/bash2 username=('liudehua' 'zhangxueyou' 'langchaowei')3 echo ${username[*]}4 echo ${username[@]}

计算数组的长度:

echo ${#username[*]}

传值:

脚本名 参数一 参数二 参数三

接收参数 $1 $2 $3

  1 #! /bin/bash2 echo $03 echo $1

访问第0个参数(脚本名)和第1个参数

$# 传递到脚本的参数个数

$$ 脚本运行的当前进程id号

$? 显示最后命令的退出状态。0表示没有错误,其他任何值表示有错误

#输出重定向

命令 > 输出重定向

命令 >> 输出追加重定向

例如:

echo 'hello' > test.txt

本来echo命令是要在终端输出的,重定向符号>将输出重定向到了test.txt中(创建文件+覆盖写)

如果想将test.txt清空可以:

echo ''>test.txt

追加写:

echo 'hello world' >> test.txt

#输入重定向

命令

例如:

wc -l 可以统计行数

wc -l < test.txt

相当于 cat test.txt | wc -l

标准输出文件(stdout):stdout的文件描述符为1,Unix程序默认向stdout输出数据

标准错误文件 (stderr):stderr的文件描述符为2,Unix程序会向stderr流中写入错误信息

例如:

但是如果这样写:

ech '111' 2>test.txt

就会将错误信息输入到test.txt中

/dev/null 是一个黑洞

echo 'xxx' > /dev/null 2>&1

2>&1 表示不论前面的命令错误与否,都往黑洞里面输入。

#shell 流程控制:

if

if [ condition ]then...fi
if [ condition ]
then...
else...
fi

特别注意 condition和括号之间一定要有空格。

if [ condition ]
then...
elif [ condition ]
then...
fi

例如:

#! /bin/bash
score=$1if [ $score -lt 60 ]
thenecho '不及格'
elif [ $score -gt 60 -a $score -lt 80 ]
thenecho '良好'
elseecho '优秀滴'
fi

#运算符

== !=  -eq -ne -gt -lt -ge(大于等于) -le(小于等于)

#布尔运算符

!(非) -o(或) -a(与)

#逻辑运算符

|| &&

如果要用这种写法,条件必须用两个中括号

[[  condition1 && condition2 ]]

投机取巧地写法:

#! /bin/bash[[ $1 -eq 888 ]] &&  echo '恭喜发财!'

因为当第一个条件为真时, && 符要返回真假,必须执行第二条件。所以当参数1位888时,第二句话执行了。

当参数1不为888时,第一个条件为false,短路运算,不用判断第二个条件。

#文件测试运算:

-d 是否为目录 或者可以直接理解为判断一个目录是否存在

-f 是否为文件 判断一个文件是否存在

-e 文件或目录是否存在。

#! /bin/bashif [ -f $1 ]
then echo '存在该file:'$1
elseecho '不存在该file'
fi

小脚本:判断一个文件夹是否存在,如果不存在,则创建它

#! /bin/bash
[[ -d $1 ]] || mkdir $1

判断一个文件是否存在,如果不存在,则创建它:

#! /bin/bash[ -f $1 ] || touch $1

#基本运算符:

shell脚本中没有+ - * / 这些运算符

但是expr 命令却有算数运算的功能

#! /bin/basha=1
b=2
echo `expr $a + $b`
echo `expr $a - $b`
echo `expr $a \* $b`
echo `expr $a \/ $b`

注意:用反引号,且变量和运算符之间需要有空格,乘法和除法需要转义

可以用$()来替换反引号,这样shell脚本的通用性更好。

小脚本:

#! /bin/bash
ip=`ifconfig | egrep 'broadcast' | awk '{print $2}'`
echo $ip

#for

for 变量 in ...

do

    ....

done

例如:

#! /bin/bashfor i in 1 2 3 4 5
do echo $i
done

#! /bin/bashfor i in {a..z} 
do echo $i
done

例2:

#! /bin/bash
username=('liudehua' 'liming' 'zhangxueyou')
for i in {0..2} 
do echo ${username[i]}
done

例3:

例4:批量创建文件夹

例5:列出某文件夹下所有的目录:

删除当前目录下的所有目录:

#while

while condition

do

  ...

done

例1:

#! /bin/bashwhile true
do echo 'hello world'
done

例2:

#! /bin/bashwhile read name 
do echo 'hello world '$name
done

read 会等待用户输入,当用户输入并回车,就会将输入的内容传给read,read将其赋值给变量name

#case

case 值 in

      情况1)

      ;;

      情况2)

       ;;

       *)

       ;;

esac

*表示default

例1:启动脚本大体框架

#! /bin/bashaction=$1
case $action instart)echo 'start';;stop)echo 'stop';;restart)echo 'restart';;*)echo 'start|stop|restart';;
esac

#Shell函数

函数的定义:

法一:

function 函数名(){

}

法二:

函数名(){

}

函数调用

函数调用要在函数定义之后,才可以调用,调用只用函数名即可。

#! /bin/bashfunction getUserName(){echo 'this is function getUserName'
}
getUserName

函数的返回值:

#! /bin/bashfunction getUserName(){return 255
}
getUserName
echo $? #用来接收函数的返回值

注意返回值只能是数字,并且正数不能超过256,否则会发生溢出。

#! /bin/bashfunction getUserName(){echo $(expr $1 + $2)
}
getUserName 2 3

如果参数超过10,不能用$10来接受,必须用$[10] $[11] …这种

#文件引入

方法一:

. 文件的绝对路径

方法二:

source 文件的绝对路径

例如:

include.sh

#! /bin/bashfunction mk_dir(){dir=$1[ -e $dir ] || mkdir $dir
}

main.sh

#! /bin/bash
. /Users/mac/shellscript/include.shmk_dir /Users/mac/shellscript/Test

#输出带颜色的字体:

建议将其封装成函数:

# /bin/bash
function printColor(){echo -e "\033[$1m $2 \033[0m"
}
printColor 31 "hello world"
printColor 32 "hello world"
for i in {31..37}
doprintColor $i "hello Shell"
done


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部