简介:
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>遍历
- for((i=0;i<${#array_var[*]};i++))
- do
- echo ${array_var[i]};
- done
或
- for var in ${array_var[*]}
- do
- echo $var;
- done
4. 运算符
1>整数运算:let,[],(()),expr
- no1=4;no2=5;
- let result=$no1+$no2
- result=$[ $no1 + $no2 ]
- result=$(( $no1 + $no2 ))
- result=$(expr $no1 + $no2) #运算符两边要空格!
2>浮点运算:bc
- "4*0.56" | bc #运算符有:+加,-减,*乘,/除,^指数,%余数,a(x) 正弦,c(x) 余弦
在运算前,可设置参数,用;号隔开。如设置精度:"scale=2;3/8" | bc
5. 控制语句
1>条件:if,else
- if [ $name = 'admin' ]
- then
- echo 'admin';
- fi
- if [ $name = 'admin' ]
- then
- echo 'admin';
- else
- echo 'user';
- fi
- if [ $name = 'admin' ]
- then
- echo 'admin';
- elif [ $name = 'dba' ]
- echo 'dba';
- else
- echo 'user';
- 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,untilfor:
- for((i=0;i<10;i++))
- do
- echo $i;
- done
while:
- i=0;
- while(($i<10))
- do
- echo $i;
- let i++;
- done
until:
- i=0;
- until(($i==10))
- do
- echo $i;
- let i++;
- done
跳出循环:break,continue
6. 函数
1>定义
- function fname(){
- statement;
- }
- fname arg1 arg2;
3>参数
$1,$2...
参数个数:$#
全部参数字符串:$*
全部参数数组:$@
4>导出函数:export -f fname
4>返回值
return 返回整数
echo 返回字符串(函数中的命令如grep会影响输出,需要重定向)
4>引用
- . ./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
- #trim string
- #arg1 = string
- function trim(){
- echo $1 | sed -e 's/ ∗ //' -e 's/ ∗$ //' -e 's/\r//'
- }
6. 数组contains
- #array contains() method
- #arg1 = array, arg2 = item
- function contains(){
- array=($@)
- arrayLength=$(( $# - 1 ))
- for((k=0;k<${arrayLength};k++))
- do
- arrayItem=${array[$k]}
- if [ $arrayItem = $2 ]
- then
- echo "true"
- return 0
- fi
- done
- echo "false"
- }
- [ $? -eq "0" ];
- then
- echo "true";
- else
- echo "false";
- fi