Shell编程

1. 基础

	1、帮助信息 wc --help
	2、#此处是注释代码
	3、脚本首行  #!/bin/sh

$0      当前脚本的文件名  
$n      传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。  
$#      传递给脚本或函数的参数个数。 
exit;    //终止脚本执行    
\          转义符号

2. 变量 (不要空格)

声明: i=1
使用: $i / ${i}
                

2.2 获取、设置环境变量

echo $LANG

2.3 Shell特殊变量

$0      当前脚本的文件名  
$n      传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。  
$#      传递给脚本或函数的参数个数。  
$*      传递给脚本或函数的所有参数。  
$@      传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同,下面将会讲到。  
$?      上个命令的退出状态,或函数的返回值。一般情况下,大部分命令执行成功会返回 0,失败返回 1。  
$$      当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 

3. 数组和循环

声明: array=(element1 element2 element3 .... elementN) 		//()括起来 空格分开
读取: #echo ${array[0]} 
遍历: ${array[@]}  
循环: 	(1) for data in ${array[@]}  
			do  
				echo ${data}  
			done  
		(2) 可用标准的for循环
		(3) for shname in `ls *.sh`
		(4) while循环
			i=1
			while(($i<100))

4. if 分支

4.1 示例

// 必须注意 if中的空格
g_SFTP_AUTH_LLD=$(cat $cfg_name|grep "^OS_AUTH_MODE=" |awk -F '=' '{print $2}')

    if [ ! -z "$1" ]; then 
        generate_elb_config
    fi

if [ "$g_SFTP_AUTH_LLD" == "" ];then
	g_SFTP_AUTH=$(cat $cfg_name|grep "^SFTP_AUTH_METHOD=" |awk -F '=' '{print $2}')
else
	g_SFTP_AUTH=$g_SFTP_AUTH_LLD
fi

4.2 条件表达式

if [ -f  file ]    如果文件存在
if [ !  -f  file ]    如果文件不存在
if [ -d ...   ]    如果目录存在
if [ -s file  ]    如果文件存在且非空 
if [ -r file  ]    如果文件存在且可读
if [ -w file  ]    如果文件存在且可写
if [ -x file  ]    如果文件存在且可执行   
if [ int1 -eq int2 ]    如果int1等于int2   
if [ int1 -ne int2 ]    如果不等于    
if [ int1 -ge int2 ]       如果>=
if [ int1 -gt int2 ]       如果>
if [ int1 -le int2 ]       如果<=
if [ int1 -lt int2 ]       如果<
if [ -z STRING ]         “STRING” 的长度为零则为真。
if  [ STRING ]        “STRING” 的长度为非零 non-zero则为真。 //注, [ -n STRING ] 此种判断有误

5. 定义函数

function getBinFlag()
{
	isBinWithI=`lsattr -d /home/huawei/mdn2000/cmi/bin`
	echo $binIFlag > /tmp/cmi_update_bin_flag.ini
}

5.1 待参数的函数

funtion printName(){
    echo $1     //输出值aa
}

printName aa bb 
printName $@    //$@--表示全部参数

6. 字符串处理

//连接字符串: 
    var3=${var1}${var2}
    catalinafilename="catalina.sh"$datetime    

6.1 字符串判空

#!/bin/sh

STRING=
if [ -z "$STRING" ]; then 
    echo "STRING is empty" 
fi

if [ -n "$STRING" ]; then 
    echo "STRING is not empty" 
fi

6.2. #()--字符串特定删除和替换

file=/dir1/dir2/dir3/my.file.txt

${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 /  及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 .  及其左边的字符串:file.txt
${file##*.}:删掉最后一个 .  及其左边的字符串:txt
${file%/*}:删掉最后一个  /  及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 /  及其右边的字符串:(空值)
${file%.*}:删掉最后一个  .  及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个  .   及其右边的字符串:/dir1/dir2/dir3/my
${file/dir/path}:将第一个dir 替换为path:/path1/dir2/dir3/my.file.txt
${file//dir/path}:将全部dir 替换为 path:/path1/path2/path3/my.file.txt

//记忆方法如下
# 是 去掉左边(键盘上#在 $ 的左边)
%是去掉右边(键盘上% 在$ 的右边)
单一符号是最小匹配;两个符号是最大匹配
${file:0:5}:提取最左边的 5 个字节:/dir1
${file:5:5}:提取第 5 个字节右边的连续5个字节:/dir2

7. 获取时间

//将当前时间赋给变量--20171214215436
datetime=$(date +%Y%m%d%H%M%S)	

获取明天的日期	date -d next-day +%Y%m%d
获取昨天的日期	date -d last-day +%Y%m%d
获取上个月的年和月	date -d last-month +%Y%m
获取下个月的年和月date -d next-month +%Y%m
获取明年的年份date -d next-year +%Y

% : 印出 
% %n : 下一行 
%t : 跳格 
%H : 小时(00..23) 
%I : 小时(01..12) 
%k : 小时(0..23) 
%l : 小时(1..12) 
%M : 分钟(00..59) 
%p : 显示本地 AM 或 PM 
%r : 直接显示时间 (12 小时制,格式为 hh:mm:ss [AP]M) 
%s : 从 1970 年 1 月 1 日 00:00:00 UTC 到目前为止的秒数 %S : 秒(00..61) 
%T : 直接显示时间 (24 小时制) 
%X : 相当于 %H:%M:%S 
%Z : 显示时区 
日期方面 : 
%a : 星期几 (Sun..Sat) 
%A : 星期几 (Sunday..Saturday) 
%b : 月份 (Jan..Dec) 
%B : 月份 (January..December) 
%c : 直接显示日期和时间 
%d : 日 (01..31) 
%D : 直接显示日期 (mm/dd/yy) 
%h : 同 %b 
%j : 一年中的第几天 (001..366) 
%m : 月份 (01..12) 
%U : 一年中的第几周 (00..53) (以 Sunday 为一周的第一天的情形) 
%w : 一周中的第几天 (0..6) 
%W : 一年中的第几周 (00..53) (以 Monday 为一周的第一天的情形) 
%x : 直接显示日期 (mm/dd/yy) 
%y : 年份的最后两位数字 (00.99) 
%Y : 完整年份 (0000..9999) 

14、 eval命令

test.txt内容:hello shell world!

myfile="cat test.txt"

(1)echo $myfile  #result:cat test.txt
(2)eval echo $myfile  #result:hello shell world!

从(2)可以知道第一次扫描进行了变量替换,第二次扫描执行了该字符串中所包含的命令

15、其它命令

15.1 shift-脚本参数位移

//shift(shift 1) 命令每执行一次,变量的个数($#)减一(之前的$1变量被销毁,之后的$2就变成了$1),而变量值提前一位。同理,shift n后,前n位参数都会被销毁

#!/bin/bash  
echo "参数个数为:$#,其中:"  
for i in $(seq 1 $#)  
do  
  eval j=\$$i  
  echo "第$i个参数($"$i"):$j"  
done  
  
shift 3  
  
echo "执行shift 3操作后:"  
echo "参数个数为:$#,其中:"  
for i in $(seq 1 $#)  
do  
  #通过eval把i变量的值($i)作为变量j的名字  
  eval j=\$$i  
  echo "第$i个参数($"$i"):$j"  
done  

//结果
参数个数为:5,其中:
第1个参数($1):a
第2个参数($2):b
第3个参数($3):c
第4个参数($4):d
第5个参数($5):e
执行shift 3操作后:
参数个数为:2,其中:
第1个参数($1):d
第2个参数($2):e
posted @ 2017-07-20 17:17  Desneo  阅读(263)  评论(0编辑  收藏  举报