1、第一行需指定所用的shell : #!/bin/bash/
2、打印命令:echo
-n:抑制换行
3、使用命令行参数:
$# : 传入脚本的命令行参数个数
$* : 所有命令行参数值,在各个参数值之间留有空格(作为一个单词处理)
$@: 所有命令行参数值(作为多个单词处理)
$0 : 命令本省(shell文件名)
$1 : 第一个命令行参数
$2 : 第二个命令行参数
获取用户输入的最后一个参数 ${!#} 不能用${$#}
4、数学计算:
expr做数学计算
把计算结果赋值给其它变量的时候需要加反引号
5、if语句:
if[ condition ] #condition前后都要有空格
then
commands
else
commands
fi
if嵌套:
if command1
then
command2
elif command3
then
command4
fi
6、条件比较:
-eq 相同
-ne 不同
-gt 大于
-lt 小于
-ge 大于或等于
-le 小于或等于
-z 为空
-n 不为空
7、字符串比较:
str1 = str2 检查str1与str2是否相同
!=
<
>
-n str1 检查str1长度是否大于0
-z str1 检查str1长度是否为0
8、文件比较:
-d file 检查file是否存在并且是一个目录
-e file 检查file是否存在
-f file 检查file是否存在并且是一个文件
-r file 检查file是否存在并且可读
-s file 检查file是否存在并且不为空
-w file 检查file是否存在并且可写
-x file 检查file是否存在并且可执行
-O file 检查file是否存在并且被当前用户拥有
-G file 检查file是否存在并且默认组是否为当前用户组
file1 -nt file2 检查file1是否比file2新
file1 -ot file2 检查file1是否比file2旧
#两个条件同时满足
if [ condition1 ] && [ condition2 ]
then
command1
fi
#两个条件其中一个满足
if [ condition1 ] || [ condition2 ]
then
command1
fi
#取反
if [ ! condition ]
then
command1
fi
双圆括号:
(( command1 )) #允许像C一样的操作
case语句:
case variable in
pattern1)
command1;;
pattern2)
command2;;
*) # *号表示其它的值
default commands;;
esac:
9、for语句:
方法1:
for var in list
do
commands
done
方法2:
for((i = 0;i < 10;i++))
do
commands
done
10、从文件中读取数据:
file="filename"
for data in `cat $file`
do
echo "data is $data"
done
11、IFS : 改变内部字段分隔符
通常用法:
IFS_OLD=$IFS
IFS=$'\n':;
code
IFS=$IFS_OLD
12、获取当前目录下的文件及文件的子文件:
#for file in `pwd`/* #通配,当前目录下所有文件
for file in `find`
do
if [ -d "$file" ]
then
echo "$file is a directory"
elif [ -f "$file" ]
then
echo "$file is a file"
fi
done > output.txt #重定义循环输出
13、getopts命令:getopts optstring variable
参数:
optstring : 选项字符串
variable : 参数
如果选项字母需要参数值后面加上一个冒号
如果要禁止输出错误消息,那么使选项字符串以冒号开头
实例:
while getopts ab: opt
do
case “$opt” in
a) echo “found –a option”;;
b) echo “found –b option with value $OPTARG”;;
esac
done
选项 | 描述 | 选项 | 描述 |
-a | 显示所有对象 | -n | 使用非交互式(批量)模式 |
-c | 生成计数 | -o | 指定一个输出文件来重定向输出 |
-d | 指定目录 | -q | 以quiet模式执行 |
-e | 展开对象 | -r | 递归处理目录和文件 |
-f | 指定读取数据的文件 | -s | 以silent模式执行 |
-h | 显示命令的帮助信息 | -v | 生成verbose输出 |
-i | 忽略大小写 | -x | 排除和拒绝 |
-l | 生成长个数的输出 | -y | 设置所有提问的回答为yes |
表13.1 常用的Linux命令行选项
14、读取用户输入:
基本读取read
read如果没有指定变量,默认存放在环境变量$REPLY中
-p : 可以在read命令中直接指定一个提示
-t : 指定一个等待输入时间,用法-t time
eg:
if read –t 5 –p “plase input your name:” name #会输入到错误流。。。
then
echo $name
else
echo –e “\nyou are too slow”
fi
-n : 指定输入的字符数,当达到n指定的字符数自动结束输入,用法-n后面直接接要输入的字符数
-s : 是用户输入不显示在窗口上,如输入密码的时候
15、重定向:
将STDEER和STDOUT分开重定向:
eg: ls –al test1 test2 2> error.txt 1> right.txt
将STDEER和STDOUT重定向到同一个文件:采用&>进行重定向
临时重定向:
eg: echo “this is an error” >&2 #重定向到错误流
./bash.sh 2> tmp.txt #重定向错误流到tmp
永久重定向:(无法切换回来)
exec 1> file
exec 2> errfile
重定义输入:(无法切换回来)
exec 0< inputfile
重定向文件描述符: (可切换回来)
通过文件描述符3把1(STDOUT)保存起来
exec 3>&1
exec 1>file
echo “someing write to file”
exec 1>&3
通过文件描述符4把0(STDIN)保存起来
exec 4<&0
exec 0<file
while read line
do
echo $line
done
exec 0<&4
关闭文件描述符:
exec 3>&-
列出开放文件描述符:
/usr/bin/lsof
禁止命令输出:
commond > /dev/null #输出到空文件
/dev/null >file #清空file里面的所有内容
创建临时文件:
mktemp
-t: 在/tmp下面创建临时文件
-d: 创建一个临时目录
file=`mktemp –t temp.XXXXXX`
消息记录:
tee: 将消息打印在STDOUT和tee所指定的文件里面
tee filename
-a 以追加的方式写入filename
16、脚本控制
终止信号:Ctrl+c
停止信号:Ctrl+z
信号捕获:trap commands signals
trap “echo hello world” SIGINT SIGTERM
脚本退出之前会执行执行一些命令:
trap “echo exit” EXIT
移除捕获:trap - EXIT
不使用控制台的情况下运行脚本:nohup ./xx.sh &
查看作业:jobs
参数 | 描述 |
-l | 列出进程的PID和作业编号 |
-n | 仅列出自上一次shell通知以来已经更改了状态的作业 |
-p | 仅列出作业的PID |
-r | 仅列出运行的作业 |
-s | 仅列出停止的作业 |
表16.1 作业命令参数
重新启动停止的作业:bg 作业号 fg 作业号(后台运行)
17、数组变量与函数
数组的传递:
myarray=(0 1 2 3 4 5 6)
farray ${myarray[*]}
函数接收数组:
function farray
{
local newarray
newarray=(`echo “$@”`)
echo “new array is: ${newarray[*]}”
echo “the third number is: ${newarray[2]}”
}
18、创建库
. pathname 加载库
或者source pathname #pathname为库的名称含路径如:./mylib
19、添加颜色
eg:^[[33m
^[是Ctrl+V的组合键后面一个[需要自己添加
20、sed编程
替换:s/pattern/replacdment/flags
flags:
-数字:表示新文本替换的模式
-g:表示用新文本替换现有文本的全部字符
-p:打印文本中包含替换字符串的那一行常和-n(禁止sed编辑器输出)一起使用
-w file: 将替换的结果写入文件
eg: sed ‘s/test/trial/2’ data #替换每行的第二个test
使用地址:
eg: sed ‘2,3s/dog/cat/’ file #只替换2,3行里面的dog
sed ‘2,$s/dog/cat/’ file #从第2行开始替换知道末尾
删除行:d (只从输出删除,原始文件不变)
eg: sed ‘2d’ data #删除第2行
插入和附加文本:
sed ‘[address]command\
new line’
command:
i: 在指定行之前添加新的一行
a: 在指定行之后添加新的一行 #$a\ 在文件末尾添加
eg: echo “testing” | sed ‘i\
>this is a test’
更改行:c
eg: sed ‘3c\
>this is a changed line ’ data
替换命令 sed ‘y/inchars/outchars/’
eg: sed ‘y/123/789/’ data #1->7 2->8 3->9
写文件: [address]w filename
读文件: [address]r filename
21、正则表达式
正则表达式中的特殊字符:.*[]^${}\+|() #作为文本字符需要转义\
定位符:
^[address] #address只能出现在文本开头的位置
[address]$ #address只能出现在文本结尾的位置
查找只包含一特定文本模式的数据行:
sed –n ‘/^this is a test$/p’ data
移除空行:sed ‘/^$/d’ data
点字符:. #通配一个字符 eg: sed –n ‘/.at/p’ data # xat
字符类: echo “Yes” | sed –n ‘/[Yy]es/p’ #yes或Yes匹配
echo “yes” | sed –n ‘/[Yy][Ee][Ss]/p’ #yes/Yes/yEs…
否定字符类: sed –n ‘/[^ch]at/p’ data #xat 除了cat和hat
使用范围:[0-9] #匹配0-9之间的数值
特殊字符
*:可以不出现或者出现多次
?:可以不出现或者出现一次
+:至少出现一次
{}:--->
m: 正好出现m次
m,n:出现至少m次最多n次
|:或者,用()括起来
(| |-|) :要么没有要么为空格或-号
( |-|) :空格或者-号
注意:gawk不能识别正则表达式,必须加上--re-interval命令