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

shell基本

2015-06-23 14:19 387 查看
1. 按行读取文件

#!/bin/bash

exec < a.txt
while read line
do
   echo $line
done


2. shell日期

u=`date "+%Y-%m-%d %H:%M:%S"`
echo $u
echo $u >> d.logkkkk


3. 分号, 多行命令分割符号如:

echo "begin bak..." ; cp $filename $filename.bak
if [ $var -eq 0 ]; then


双分号;;可以作为case的终止结束符号

4. 双引号, 单引号, 逗号, 点

" 字符串中大部分字符会阻止(不解析, 作为普通字符串)

' 字符串所有的字符会阻止(echo '$var' 将输出$var )

, 逗号, 链接算术运算但只返回最后一项 如 let "a = ((b=3, 5*10))" # a=50, b=3

5. 转意\ \x 等价 "x" 也等价于 'X'

6. 冒号: 空命令, 该命令返回true(0) 如

检测变量是否设置

: "${username?}“ # username: parameter null or not set 没有被设置的情况

while :
do
   sleep 1
done
if 成立啥不做

a=0
if [ $a -eq 1 ];
then :
else
   echo "eq"
fi
清空某个文件

: > data.log


7. $

$var 变量引用

${} 参数替换

$? 命令执行退出状态码,0 为正常

$$ 进程ID变量

$*, $@ 所有的位置参数

$# 变量个数

正则表达式结束符

8. () 命令组,如(a=shit; echo $a), 命令组作为子shell运行, 所以父进程不能使用子进程的变量

prog_dir=$(cd $(dirname $0)/..; pwd)  # 切换到脚本目录,这样能避免很多路径问题


9 [ ] 条件测试 [[ ]] 测试 [ ] 数组元素
10. (()) 整数扩展

11. IFS 内部分割符号

#!/bin/bash
var="(\\]\$"
echo $var  # (\]$*
echo "$var" # (\]$*
echo '$var'
IFS='\\'
echo $var # ( ]$*
echo "$var" # (\]$*
12. 转意符 \

#!/bin/bash
echo "\v\v"  # \v\v
echo -e "\v\v"  # 垂直制表符号


13. 返回码 exit

脚本调用结束, 都会有一个返回值, 0表示成功,非0表示不成功, 返回值必须在0-255, 必须是整数. 不写的话等价 exit $?

14 if 测试命令返回, 也就是if command , command并非一定是[ ], [[ ]]. 同时[[ ]] 不一定非与if不可 如: [ 1 -ne 2 ] && echo "1 not eq 2"

# 非常有用的if-grep 结构
# if 测试命令返回值是不是true(0)

if echo "aa" | grep -q test.txt 
then
  echo "aa contain"
else
  echo "aa not contain"
fi


if的嵌套

a=1
b=2

if $a
 if [[ $a < $b ]]
  then echo "a<b"
 else
   echo "x"
 fi
then
 echo "y"
fi


14. (( )) 算术扩展表达式, 如果表达式的结果未0则命令返回非0, 就是假。与命令退出码恰好相反, 参考13点

#!/bin/bash

if (( 0 )) # false
then
 echo "true"
else
 echo "false"
fi

15. 常用的测试符号

-n(-z) 测试变量是否存在(未定义或者是NULL)

-e 文件是否存在

-f 是否是否文件

f1 -nt f2 文件f1比文件f2新(-ot 比较旧)

字符串比较的时候,为了安全, 可以添加一个字符 如: [[ "x$a" == "x$b" ]]

例子:

#!/bin/bash

# cat file

NOARGS=65
NOTFOUDN=66
NOTGZIP=67
if [ $# -eq 0 ]
then
  echo "Usage: basename $0 filename"
  exit $NOARGS
fi

filename=$1

if [ ! -f $filename ]
then
 echo "$1 not found"
 exit $NOTFOUND
fi

if [ "${filename##*.}" != "txt" ]   ## 变量替换 value##pattern  替换掉##前面的返回匹配的
then
  echo "$filename is not txt file"
fi

cat $filename | more

exit $?


字符串查找,匹配,子串 ,正则处理bash都可以很好的处理

#!/bin/bash

# length 
str="abcd"
echo ${#str} # 4
echo `expr length $str` # 4

# match length

str="12abcd23#?32"
echo `expr match "$str" 12[a-z]*.23` # 8

# index

echo `expr index "$str" cd` # 5

# substring

echo `expr "${str:3}"` # bcd23#?23
echo `expr "${str:3:2}"` # bc
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: