Shell编程

简介:

Shell脚本 ,就是一个可执行文件,后缀为.sh,文件中是多条要顺序执行的linux命令。

一、如何写和执行;

二、程序设计相关(注释,变量/字符串,数组,运算符,控制语句,函数);

三、常用命令(输入,输出,文件读写,日期时间);

一、如何写和执行:

1. 如何写

vi filename.sh

文件中的linux命令用;号隔开。

2. 如何执行

1>直接法:sh filename.sh

2>可执行文件法:

文件开头用 #!/bin/bash 声明使用的linux命令库;

赋予执行权限:chmod a+x filename.sh;

./filename.sh。

3. 如何调试

set -x

二、程序设计

1. 注释:#

2. 变量

1>赋值:name=value

2>调用:$name或${name}

3>环境变量:$PATH,$HOME,$PWD,$USER,$UID,$SHELL

4>预定义变量:$?命令执行后返回的状态,$$当前进程的进程号

5>导出:export name

被导出的变量在当前shell脚本执行的任何程序都会继承这个变量。如添加新路径:export PATH="$PATH:/home/user/bin"

数据类型都为字符串

1>长度:${#name}

2>相连:${name}${age}

3>引号:单引号',双引号",反引号`

单引号中的字符会被解析为字符串;如:name='Jason'。

反引号中的字符会被解析为命令。

双引号中的$会被解析为变量,如:name="${firstName}.${lastName}";

双引号中的`会被解析为命令,如:name="`whoami`"。

4>字符串转数组

string="a c d"

arr=($string)

5>字符串截取

string="http://www.baidu.com/index.html"

截取左边:string=${string#*//}   得到  "www.baidu.com/index.html"

截取右边:string=${string%/*}   得到  "www.baidu.com"

3. 数组

1>定义:array_var=(1 2 3 4 5);

2>使用:${array_var[0]}

3>长度:${#array_var[*]}

4>全部:${array_var[*]}

5>添加:array_var=(${array_var[*]} ${newItem})

6>遍历

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. for((i=0;i<${#array_var[*]};i++))  
  2. do  
  3.   echo ${array_var[i]};  
  4. done  

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. for var in ${array_var[*]}  
  2. do  
  3.   echo $var;  
  4. done  

4. 运算符

1>整数运算:let,[],(()),expr

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. no1=4;no2=5;  
  2. let result=$no1+$no2  
  3. result=$[ $no1 + $no2 ]  
  4. result=$(( $no1 + $no2 ))  
  5. result=$(expr $no1 + $no2)       #运算符两边要空格!  

2>浮点运算:bc

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. "4*0.56" | bc                    #运算符有:+加,-减,*乘,/除,^指数,%余数,a(x) 正弦,c(x) 余弦  

在运算前,可设置参数,用;号隔开。如设置精度:"scale=2;3/8" | bc


5. 控制语句

1>条件:if,else

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if [ $name = 'admin' ]  
  2. then  
  3.   echo 'admin';  
  4. fi  
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if [ $name = 'admin' ]  
  2. then  
  3.   echo 'admin';  
  4. else  
  5.   echo 'user';  
  6. fi  
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. if [ $name = 'admin' ]  
  2. then  
  3.   echo 'admin';  
  4. elif [ $name = 'dba' ]  
  5.   echo 'dba';  
  6. else  
  7.   echo 'user';  
  8. fi  

test 或 [ ] 支持判断数值、字符和文件

(1)数值测试:

-eq:等于
-ne:不等于
-gt:大于
-ge:大于等于
-lt:小于
-le:小于等于
(2)字符串测试:
=:等于
!=:不相等
-z 字符串:字符串长度为零
-n 字符串:字符串长度不为零
(3)文件测试:
-e 文件名:文件存在
-r 文件名:文件存在且可读
-w 文件名:文件存在且可写
-x 文件名:文件存在且可执行
-s 文件名:文件存在且至少有一个字符
-d 文件名:文件存在且为目录
-f 文件名:文件存在且为普通文件
-c 文件名:文件存在且为字符型文件
-b 文件名:文件存在且为块文件
非(”!”)、且(“-a”)、或(“-o")。三个逻辑操作符用于将测试条件连接起来。

注意:[]内侧和符号两边都要空格!!!

2>循环:for,while,until

for:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. for((i=0;i<10;i++))  
  2. do  
  3.  echo $i;  
  4. done  

while:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. i=0;  
  2. while(($i<10))  
  3. do  
  4.  echo $i;  
  5.  let i++;  
  6. done  

until:

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. i=0;  
  2. until(($i==10))  
  3. do  
  4.  echo $i;  
  5.  let i++;  
  6. done  

跳出循环:break,continue

6. 函数

1>定义

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. function fname(){  
  2. statement;  
  3. }  
2>调用
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. fname arg1 arg2;  

3>参数

$1,$2...

参数个数:$#

全部参数字符串:$*

全部参数数组:$@

4>导出函数:export -f fname

4>返回值

return 返回整数

echo 返回字符串(函数中的命令如grep会影响输出,需要重定向)

4>引用

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. . ./function  


三、常用命令

1. 输入

从控制台获取输入 read var

1>密码:read -s var

2>提示:read -p "Enter input:" var

3>限制字符数:read -n 2 var

4>限制时间数:read -t 5 var

5>指定定界符:read -d "," var


2. 输出

输出到控制台 echo, printf

1> echo:会自动换行。

2> printf:格式化输出。

%[-][length]type是格式替换符:

type有s,f;替换字符串和浮点数。

length表示显示位数;默认右对齐,添加-则左对齐。

如:printf "%-5s %-4.2f\n" Smith 90.222

3. 文件操作

1>按行处理:sed

sed [options] "command" file(s)  

options: -i 则修改源文件;-e则多命令操作

command: 由两部分组成:定位+操作

定位:通过指定行号,正则表达式匹配。

操作:添加a;插入i;删除d;替换c;全文正则表达式替换:s/old/new/g , re 保存匹配的字符,用数字1使用;

4. 日期时间

1>查看时间:date

2>格式查看:年,月,日,星期,时,分,秒

date +%Y %b %d %a %H %M %S

3>修改时间:date --date "Jan 20 2014"

4>UTC时间:date +%s

5>延时执行:sleep 

5. 字符串trim

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #trim string  
  2. #arg1 = string  
  3. function trim(){  
  4.   echo $1 | sed -e 's/ //' -e 's/ $ //' -e 's/\r//'  
  5. }  

6. 数组contains

[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. #array contains() method  
  2. #arg1 = array, arg2 = item  
  3. function contains(){  
  4.   array=($@)  
  5.   arrayLength=$(( $# - 1 ))  
  6.   for((k=0;k<${arrayLength};k++))  
  7.   do  
  8.     arrayItem=${array[$k]}  
  9.     if [ $arrayItem = $2 ]  
  10.     then  
  11.       echo "true"  
  12.       return 0  
  13.     fi  
  14.   done  
  15.   echo "false"  
  16. }  
7. 判断命令是否成功 
[plain]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. [ $? -eq "0" ];  
  2.    then  
  3.      echo "true";  
  4.    else  
  5.      echo "false";  
  6.  fi  
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值