您的位置:首页 > 运维架构 > Shell

linux shell编程基础

2016-11-10 21:51 369 查看

1.变量

1)变量的分类

用户自定义变量

环境变量:主要保存和系统操作环境相关的数据。

位置参数变量:主要用来向脚本当中传递参数或定义的

与定义变量:Bash中已经定义好的变量

2)用户自定义变量

变量调用: echo $x

变量设置: set

变量删除: unset x

3)环境变量

设置环境变量
export 变量名=变量值

查看环境变量

set:查看所有变量

env:查看环境变量

3)位置参数变量

参数说明

参数作用
$nn为数字,$0表示命令本身,$1-$9代表第一到第九个参数
$*代表命令行中所有的参数,$*把所有的参数看成一个整体
$@命令行中所有参数,把每个参数区分
$#代表命令行中所有参数的个数
例子:

#!/bin/bash

echo "parameter is:   $* "

echo "parameter also is: $@"

echo "parameter number is: $#"

echo "===============*==========="

for i in  "$*"
do
echo "the parameters is:$i"
done

echo "===============@================="

for i in "$@"
do
echo  "the parameter is:$i"
done


4)预定义变量

变量说明:

变量作用
$?最后一次执行命令返回状态,0 表示争取为执行
$$当前进程的PID
$!后台运行的最后一个进程的PID
read接收键盘输入

-p “提示信息” :在等待read输入时,输出提示信息

-t “秒数”:read命令会一直等待用户输入,指定等待时间

-n “字符数”:read命令只接受指定的字符数,就会执行

-s:隐藏输入的数据,适用于机密信息的输入

2.Shell运算符

1)declare申明变量类型

选项

-:给变量设定属性类型

+:取消变量的类型属性

-a:将变量申明为数组型

-i:整数型

-x:环境变量

-r:只读

-p:显示指定变量被声明的类型

2)“$((运算式)) 或“$[运算式]”

3.环境变量配置文件

1)source命令

重新加载配置文件

2)配置文件加载顺序



3)其他配置文件

~/.bash_logout :退出登陆时加载的配置文件

~/etc/issue : 登陆后的欢迎信息

~/etc/motd : 登陆后的欢迎信息

正则表达式

1)基础正则表达式

元字符作用
*前一个字符匹配一个或者多个
.匹配除了换行符外任意一个字符
^匹配行首 例如”^hello” 匹配以”hello”开头的字符串
[]匹配中括号中的任意一个字符,例如:[aeiou]匹配任意一个元音字母,[0-9]匹配任意一位数字
[^]匹配除中括号字符以外的字符,例如[^0-9]匹配除了数字之外的字符
\转义符
{n}表示前面一个字符出现n次,例如:[0-9]{4}匹配四位数字
{n,}匹配前面一个字符不小于n次
{n,\m}表示前面一个字符最少出现n次,最多出现m次

2)字符串截取命令

cut字段提取命令:

-f n:截取第n列

-d “”:确定分隔符

3)printf输出内容

输出类型:

- %ns:输出字符串 ,表示输出几个字符

- %ni:输出整数,n代表输出几个数字

- %m.nf:输出浮点数,m和n代表整数位数和小数位数

4)awk命令

格式:
awk ‘条件1{动作1}条件2{动作2}…’文件名

例子:

cat /etc/passwd | grep /bin/bash | awk 'BEGIN{FS=":"}{print $1 "\t" $3}'


5)sed命令

格式:
sed [选项] [动作] [文件名]

选项:
-n:只把经过sed处理过的行输出到屏幕

-e:允许对输入数据应用多条sed命令编辑

-i:用sed命令修改的结果直接修改读取的文件,而不是由屏幕输出

动作:

-a:追加,在当前行后添加一行或者多行

-c:行替换,用后面的字符串替换原数据行

-i:插入当前行插入一行或多行

-d:删除

-p:打印,输出指定的行

-s:字串替换

例子:

sed -n '2p' student.txt
打印student.txt的第二行

sed  '2,4d' student.txt
删除第二到第四行

sed '2a test1 test1 test1 test1' student.txt
在第二行添加内容

sed  '4c cang bugide' student.txt
替换第四行

6)排序命令sort

格式:
sort [选项] 文件名

选项:

-f:忽略大小写

-n:以数值型进行排序

-r:反向排序

-t:指定分隔符(默认为制表符)

-k n[,m] :按照指定的字段范围排序

7)统计命令wc

格式:
wc [选项] 文件名

选项

-l:只统计行数

-w:只统计单词数

-m:只统计字符数

条件判断与流程控制

1判断条件

1)按照文件类型进行判断

常用测试选项作用
-d 文件判断给文件是否存在,并且是否为目录文件(是目录文件为真)
-e 文件判断文件是否存在(存在为真)
-f 文件判断文件是否存在,并且是否为普通文件(是普通文件为真)

2)按照文件权限进行判断

测试选项作用
-r 文件判断文件是否存在,并且是否该文件拥有读权限(有读权限为真)
-w 文件判断该文件是否存在,并且该文件是否拥有写权限(有写权限为真)
-x 文件判断该文件是否存在,并是否该文件拥有执行权限

3)两个文件进行比较

测试选项作用
文件1 -nt 文件2判断文件1的修改时间是否比文件2新(如果新则为真)
文件1 -ot 文件2判断文件1的修改时间是否比文件2的旧(如果旧则为真)
文件1 -ef 文件2判断文件1是否和文件2的Inode号一致

4)两个整数之间比较

测试选项作用
整数1 -eq 整数2判断整数1是否和整数2相等
-ne判断不相等
-gt大于
-lt小于
-ge大于等于
-le小于等于

5)字符串的判断

测试选项作用
-z 字符串判断字符串是否为空(为空返回真)
-n 字符串判断字符串是否为非空
字符串1 == 字符串2判断两个字符串是否相等
字符传1 != 字符串2判断字符串1是否和字符串2不相等

2.条件判断的例子

判断磁盘利用率是否大于10%

#!/bin/bash

test=$( df -h | grep sda2 | awk '{print $5}' | cut -d "%" -f 1)

if [ "$test" -gt 10 ]
then
echo "the use is greater 10%"
fi


判断输入是否为文件

#!/bin/bash

read -p "Please input a filename : "  file

if [ -z "$file" ]
then
echo "Error,please input filename"
exit 1
elif [ ! -e "$file" ]
then
echo "Your input is not a file"
exit 2
elif [ -f "$file" ]
then
echo "$file is a a regulare file"
elif [ -d "$file" ]
then
echo "$file is a directory!!"
fi


判断apache是否启动

#!/bin/bash

test=$(ps aux | grep httpd | grep -v grep)

if [ -n "$test" ]
then
echo "$(date) httpd is ok!"  >> /tmp/autostart-acc.log
else
service httpd start  &> /dev/null
echo "$(date) reastart httpd !!" >> /tmp/autostart-err.log
fi


case选择

#!/bin/bash

echo "feng  : input 1"
echo "fu  : input 2"
echo "bo : inpit 3"

read -t 30 -p "please input    " cho

case "$cho" in
"1")
echo "feng"
;;
"2")
echo "fu"
;;
"3")
echo "bo"
;;
*)
echo "please input right choice"
;;
esac


3 for循环例子

批量添加用户

#!/bin/bash

read -p "Please input username   " -t 30 name
read -p "Please input the number of users    " -t 30 num
read -p "Please input the password of users:" -t 30 pass

if [ ! -z "$name" -a ! -z "$num" -a ! -z "$pass" ]
then
y=$(echo $num | sed 's/[0-9]//g')
if [ -z "$y" ]
then
for((i=1;i<=$num;i=i+1))
do
/usr/sbin/useradd  $name$i  &>/dev/null
echo $pass | /usr/bin/passed --stdion $name$i &> /dev/null
done
fi
fi
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  linux shell