SHELL学习笔记
2014-05-11 11:29
267 查看
1 read 可以一次性读取多个变量 read first second
从文件读取 read message < /etc/motd
变量可以用命令替换 var=`....`或者$()
数组变量的访问$(var[0])
2 $0脚本名称 $1,2,..参数。$#参数个数,没有$10,被解释成$1和0,办法:用shift移为
while [ "$#" -ge '1' ]
do
echo $1
shift
done
3 $* $@ 泛指所有的参数 for var in $@;do;done
one "two three" four five区别,不在for elem in "$*"加引号,都正常输出,无视引号中的空格,,$*加引号,则one "two three" four five成为一个元素,横向输出,而"$@"能够识别每一个元素,而且识别"two three"当做一个元素不拆分
4 返回码 $? 始终返回上一条命令的返回码
#!/bin/bash
ls -R /temp &
sleep 10
strace -p $!
&表示ls命令运行如果小于10秒,则pid过期前半句提前返回,无法跟踪。大于10秒,后半句返回,ls还在运行,可以跟踪
5 测试命令test ,用[]表达 if [ ! -z "$name" ]; 表示如果$name非空
6 删除变量赋空 var= 或者 unset var
7 BASHOPTS SHELLOPTS有一些参数
8 trap命令用于指定在接收到信号后将要采取的行动trap命令的一种常见用途是在脚本程序被中断时完成清理工作
trap捕捉到信号之后,可以有三种反应方式:
(1)执行一段程序来处理这一信号
(2)接受信号的默认操作
(3)忽视这一信号
二. trap对上面三种方式提供了三种基本形式:
第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双
引号中的命令串。
trap 'commands' signal-list
trap "commands" signal-list
为了恢复信号的默认操作,使用第二种形式的trap命令:
trap signal-list
第三种形式的trap命令允许忽视信号
trap " " signal-list
HUP(1)
挂起,通常因终端掉线或用户退出而引发
INT(2)
中断,通常因按下Ctrl+C组合键而引发
QUIT(3)
退出,通常因按下Ctrl+组合键而引发
ABRT(6)
中止,通常因某些严重的执行错误而引发
ALRM(14)
报警,通常用来处理超时
TERM(15)
终止,通常在系统关机时发送
trap cleanup 1 2 3 15
cleanup()
{
echo "yeah,,,,yean"
exit 1
}
while :
do
echo "hello world"
sleep 1
done
9 BASH_COMMAND变量用于显示正在运行的程序的行,比如中断行
LINENO显示当前程序所在行数
FUNCNAME显示函数调用栈,层层向上找
FUNCNAME[0]表示func1,FUNCNAME[2]表示main函数,终止,FUNCNAME[3....都为空
同理 BASH_SOURCE[]层层往上找调用的文件的名称 main.sh中有 . lib1.sh表示引用这个sh,. 表示source命令
10 HOSTNAME主机名(就是/etc/host里面的),HOSTTYPE主机类型(i686,表示32位机),等同于uname -n 和 uname -m
11 PIPESTATUS每当echo$(PIPESTATUS[i])会覆盖[0],所以应当一次性判读用PIPESTATUS[*] grep
12 time ls用来计算命令的运行时间 TIMEFORMAT="%2lU %S %R" 设置日期输出格式,类似printf。2表示小数点的位数,小写的l表示拓展 到分钟
13 $$表示脚本自身的进程ID,$PPID表示调用SHELL的进程ID,也即是父进程ID
14 $RANDOM随机返回0~32767的数字
15 $REPLY 是在没有为read提供变量情况下的默认变量。既read回s车,输出字符串,没有变量,会默认保存到$REPLY中
16 $SECONDS计时,输出当前脚本的运行时间
17 $GLOBIGNORE忽略通配符的某些模式,例如 GLOBIGNORE=*.gif则ls 不在输出.gif结尾的图片的名字
18 $IFS设置分隔符,默认是空格,回车,可以改为冒号,有时很有用,比如冒号分割的密码
19 TMOUT=6 超时退出,防止管理员离开忘记exit root密码
20 通配符创建多文件 touch a{1,2,3}.txt
21 -O $filename测试文件是否属于当前用户,-G 用户组
22 stat -c %U file 获取文件所属用户 %G用户组
23 if [[ =~ ]]表示正则
for name in /home/danding/myscripts/*
do
nn=`basename $name`
if [[ $nn =~ ^a.* ]];then
echo $nn
else
echo "this is no .sh file"
fi
done
24 case的用法;;结尾
read -p "please input the number?" item
case $item in
1) echo "this is 1 num" ;;
2) echo "this is 2 num";;
*) echo "the other input";;
esac
1)可以用正则 a.*) ;;&多个条件匹配
25 for循环可以用((i<=10)) ((i+=1)) $i=$(($i+1)) let i=$i+1 $i=`expr $i+1`
ping -c1 -w1
26 ${1:-sdf}表明为第一个参数提供默认值,${var:-dfsf} var没有定义时,默认为dfsf
27 break 2 跳出两层循环
28 select item in 制作菜单很管用
29 x=hello y=2 echo $x+$y 自动把文本变为0 但是expr不会,报异常
30 ${#var} 变量长度,字符串长度
31 ${var:3:2}变量的裁剪,3表示起始位置,2表示长度,可以不写表示到结尾,也可以为负数,最后一个字符是-1,类推
32 正则,模式裁剪。
${variable#word} 从开头非贪婪模式匹配
${variable##word} 开头贪婪模式匹配
${variable%word} 从结尾非贪婪模式匹配
${variable%%word} 结尾非贪婪模式匹配
phone="555-456-1414"
${phone#*-} //456-1414
${phone##*-} //1414
${phone%-*} //555-456
${phone%%-*} //555
从头裁剪的意思是从头减掉不要;从尾裁剪的意思是从尾减掉不要
33 sed命令和选项:
a\ 在当前行后添加一行或多行
c\ 用新文本替换当前行中的文本
d 删除行
i\ 在当前行之前插入文本
h 把模式空间的内容复制到暂存缓冲区
H 把模式空间的内容添加到缓冲区
g 取出暂存缓冲区的内容,将其复制到模式缓冲区
G 取出暂存缓冲区的内容,将其追加到模式缓冲区
l 列出非打印字符
p 打印行
n 读入下一行输入,并从下一条而不是第一条命令对其处理
q 结束或退出sed
r 从文件中读取输入行
! 对所选行以外的行应用所有命令
s 用一个字符串替换另外一个字符串
替换标志:
g 在行内进行全局替换
p 打印行
w 将行写入文件
x 交换暂存缓冲区和模式空间的内容
y 将字符转换成另外一个字符
sed例子:
打印:p命令
sed ‘/abc/p’ file
打印file中包含abc的行。默认情况sed把所有行都打印到屏幕,如果某行匹配到模式,则把该行另外再打印一遍
sed -n ‘/abc/p’ file 和上面一样,只是去掉了sed的默认行为,只会打印匹配的行
删除:d命令
sed ‘3,$d’ file 删除从第3行到最后一行的内容。
sed ‘$d’ file 删除最后一行的内容
sed ‘/abc/d’ 删除包含abc的行。
sed ‘3d’ file 删除第三行的内容
替换:s命令
sed ‘s/abc/def/g’ file 把行内的所有abc替换成def,如果没有g,则只替换行内的第一个abc
sed -n ‘s/abc/def/p’ file 只打印发生替换的那些行
sed ‘s/abc/&def/’ file 在所有的abc后面添加def(&表示匹配的内容)
sed -n ‘s/abc/def/gp’ file 把所有的abc替换成def,并打印发生替换的那些行
sed ‘s#abc#def#g’ file 把所有的abc替换成def,跟在替换s后面的字符就是查找串和
替换串之间的分割字符,本例中试#
指定行的范围:逗号
sed -n ‘/abc/,/def/p’ file 打印模式abc到def的行
sed -n ‘5/,/def/p’ file 打印从第五行到包含def行之间的行。
sed /abd/,/def/s/aaa/bbb/g 修改从模式abc到模式def之间的行,把aaa替换成def
多重编辑-e
sed -e ‘1,3d’ -e ‘s/abc/def/g’ file 删除1-3行,然后把其余行的abc替换成def
读文件:r命令
sed ‘/abc/r newfile’ file 在包含abc的行后读入newfile的内容
写文件:w命令
sed ‘/abc/w newfile’ file 在包含abc的行写入newfile
追加:a命令
sed ‘/abc/a\def’ file 在包含abc的行后新起一行,写入def
插入:i命令
sed ‘/abc/i\def’ file 在包含abc的行前新起一行,写入def
修改:c命令
sed ‘/abc/c\def’ file 在包含abc的行替换成def,旧文本被覆盖
读取下一行:n命令
sed ‘/abc/{n ; s/aaa/bbb/g;}’ file 读取包含abc的行的下一行,替换aaa为bbb
转换:y命令
sed ‘y/abc/ABC’ file 将a替换成A,b替换成B,c替换成C(正则表达式元字符不起作用)
退出:q命令
sed ‘/abc/{ s/aaa/bbb/ ;q; }’ file 在某行包含了abc,把aaa替换成bbb,然后退出sed。
暂存和取用:h命令(把模式行存储到暂存缓冲区)和g(取出暂存缓冲区的行并覆盖模式缓冲区)G(取出临时缓冲区的行)命令
h和g是复制行为(覆盖),H和G表示追加。
sed -e ‘/abc/h’ -e ‘$G’ file 包含abc的行通过h命令保存到暂存缓冲区,在第二条命令汇中,sed读到最后一行$时,G命令从暂存缓冲区中读取一行,追加到模式缓冲区的后面。即所有包含abc的行的最后一行被复制到文件末尾。
sed -e ‘/abc/{h; d;}’
-e ‘/def/{g; }’ file 包含abc的行会移到包含def的行上,并进行覆盖。
暂存和互换:h和x命令
sed -e ‘/abc/h’
-e ‘/def/x’ file 包含abc的行会被换成def的行。
34 shell自带的字符串替换
${var/abc/def}会把第一abc替换成def,若要全局匹配用// ${var//abc/def} #表示开头,%表示末尾 ${var/#abc/def} 把开头是abc的换成def ${var/%abc/def} 把结尾......脱字符号^用于修改变量的大小写
模式删除: 第二个不写 ${var/abc}就是删除第一个abc
35 大小写转换,要是转化为大写,用 ${var^^} ,要是转化为小写${var,,}
36 ${var:-word}提供默认值${var?word}也是,${var+word}表示var有值,输出word,否则都为空
37 简介操作:
变量的变量执行;一个变量的是PATH,想返回PATH变量的内容,
myvar=PATH
echo ${!myvar}
返回/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/danding/bin
不能直接${!PATH}要的是一个间接变量 ,PATH是一个直接变量
38 可以使用source引用其他文件中的变量 . /etc/sysconfig/network 使用网关,ip地址啥的
39 函数
myfunc()
{}
可加可不加function myfunc(){} 都行 ,函数调用 myfunc $var
40 bc 浮点数运算
[root@lancy bin]# echo "2.5*3.4" |bc
8.5
[root@lancy bin]# echo "5/3; 5/3.1" |bc
1
1
[root@lancy bin]# echo "scale=2; 5/3" |bc
1.66
[root@lancy bin]# echo "ibase=10;obase=2; 4*6"|bc
11000
[root@lancy bin]# echo "ibase=2; 110*101; obase=10" |bc
30
[root@lancy bin]# echo "ibase=2; 11110; obase=2" |bc
30
41 整个函数的重定向 myfunc > log.txt ;tee 命令可以同时重定向到stdout和文件
myfunc $var | tee log.txt
42 mktemp产生临时文件的命令 temp=`mktemp`
43 #!/bin/bash
if [ $# -lt 1 ]
then
echo "there is no option";
else
while getopts ":Iti:s:v" opt;
do
case $opt in
I)echo "option is I "
;;
t)echo "option is t "
;;
i)ii=$OPTARG;echo "option is i,the value is $ii";
;;
s)ss=$OPTARG;echo "option is s ,the value is $ss";
;;
v)echo "option is v \n";
;;
:)
echo ">>> Error: '-$OPTARG' requires an argument"
;;
?)paralist=-1;
echo ">>> Error: '-$OPTARG' not supported,please input valid argument [Itisv]"
;;
esac
done
fi
下面给出几个执行的例子:
(1)sh datediff.sh -i 1 -I -v
option is i,the value is 1
option is I
option is v \n
(2)sh datediff.sh -s -i 1
option is s, the value is -i //取s选项后的值
(3)sh datediff.sh -s //选项中有前置冒号
>>> Error: '-s' requires an argument
sh datediff.sh -s //去除选项中的前置冒号后的输出
datediff.sh: option requires an argument -- s
44 数组赋值 arrar[0]=adf
一次性赋值 arr=(ad d f erw lj)
命令赋值 stat=($(cat /proc/stat)) 或者stat=(`cat /proc/stat`)
可用IFS设置换行符,一行一行读
oldIFS=$IFS
IFS="
"
hosts=(`cat /etc/hosts`)
for hostline in ${hosts[@]}
do
echo line: $hostline
done
IFS=$oldIFS
还可以是通配符 arr=(*.mp3)
从流读取 read -a 能把输入流读入到数组
read -a 和IFS联合使用,效果更佳,比如读取/etc/passwd是冒号分割的
IFS和read放在同一行,只对read起作用,更安全
while IFS=: read -a userdetails
do
done
45 readarray 能更好的处理数组 readarray -n 4 -s 2 food
-n 指定读取的最大行数 -s 从输入的开头跳过几行,-O 指定初始索引值 -t 去掉换行符
数组的访问 ${arr[0]}
数组的长度 ${#array[@]}
数组的截取 ${array[@]:2:3}
关联数组
用declare -A array 声明
array=([singer]="john") 反向引用 ${!array[john]}
数组的复制 hobbies=(${activities[@]})
追加hobbies=(${activities[@]} diving)也可以用+=
46 $$指的是当前进程id ls -l /proc/$$/fd
有四个文件 0 1 2 255 0表示stdin 1表示stdout 2stderr
exec 3> /temp/testing 创建文件描述符3
就可以echo " sdfsdf" >&3 多次运行只是追加不能清空,清空用>/temp/testing
47 命令后面加上&符号,表示此命令后台运行,可用$!返回后台进程ID ps -fp $!
48 ps -fp $! 查看后台进程 ,事前可以跑一个sleep 100
49 jobs -l 显示后台进程 fg %2 把作业2提到前台 bg %2 把作业2放到后台 kill -9 % 关闭任何作业号 wait 等待作业完成
50 stat 文件状态 stat -c %s file
51 cat -n file指定行
52 join 命令 归并两个有序文件 研究下paste 也是合并
53 tr 流替换
54 uniq 独立的
55 factor 因子分解
56 id user 查看id groups user
从文件读取 read message < /etc/motd
变量可以用命令替换 var=`....`或者$()
数组变量的访问$(var[0])
2 $0脚本名称 $1,2,..参数。$#参数个数,没有$10,被解释成$1和0,办法:用shift移为
while [ "$#" -ge '1' ]
do
echo $1
shift
done
3 $* $@ 泛指所有的参数 for var in $@;do;done
one "two three" four five区别,不在for elem in "$*"加引号,都正常输出,无视引号中的空格,,$*加引号,则one "two three" four five成为一个元素,横向输出,而"$@"能够识别每一个元素,而且识别"two three"当做一个元素不拆分
4 返回码 $? 始终返回上一条命令的返回码
#!/bin/bash
ls -R /temp &
sleep 10
strace -p $!
&表示ls命令运行如果小于10秒,则pid过期前半句提前返回,无法跟踪。大于10秒,后半句返回,ls还在运行,可以跟踪
5 测试命令test ,用[]表达 if [ ! -z "$name" ]; 表示如果$name非空
6 删除变量赋空 var= 或者 unset var
7 BASHOPTS SHELLOPTS有一些参数
8 trap命令用于指定在接收到信号后将要采取的行动trap命令的一种常见用途是在脚本程序被中断时完成清理工作
trap捕捉到信号之后,可以有三种反应方式:
(1)执行一段程序来处理这一信号
(2)接受信号的默认操作
(3)忽视这一信号
二. trap对上面三种方式提供了三种基本形式:
第一种形式的trap命令在shell接收到signal list清单中数值相同的信号时,将执行双
引号中的命令串。
trap 'commands' signal-list
trap "commands" signal-list
为了恢复信号的默认操作,使用第二种形式的trap命令:
trap signal-list
第三种形式的trap命令允许忽视信号
trap " " signal-list
HUP(1)
挂起,通常因终端掉线或用户退出而引发
INT(2)
中断,通常因按下Ctrl+C组合键而引发
QUIT(3)
退出,通常因按下Ctrl+组合键而引发
ABRT(6)
中止,通常因某些严重的执行错误而引发
ALRM(14)
报警,通常用来处理超时
TERM(15)
终止,通常在系统关机时发送
trap cleanup 1 2 3 15
cleanup()
{
echo "yeah,,,,yean"
exit 1
}
while :
do
echo "hello world"
sleep 1
done
9 BASH_COMMAND变量用于显示正在运行的程序的行,比如中断行
LINENO显示当前程序所在行数
FUNCNAME显示函数调用栈,层层向上找
FUNCNAME[0]表示func1,FUNCNAME[2]表示main函数,终止,FUNCNAME[3....都为空
同理 BASH_SOURCE[]层层往上找调用的文件的名称 main.sh中有 . lib1.sh表示引用这个sh,. 表示source命令
10 HOSTNAME主机名(就是/etc/host里面的),HOSTTYPE主机类型(i686,表示32位机),等同于uname -n 和 uname -m
11 PIPESTATUS每当echo$(PIPESTATUS[i])会覆盖[0],所以应当一次性判读用PIPESTATUS[*] grep
12 time ls用来计算命令的运行时间 TIMEFORMAT="%2lU %S %R" 设置日期输出格式,类似printf。2表示小数点的位数,小写的l表示拓展 到分钟
13 $$表示脚本自身的进程ID,$PPID表示调用SHELL的进程ID,也即是父进程ID
14 $RANDOM随机返回0~32767的数字
15 $REPLY 是在没有为read提供变量情况下的默认变量。既read回s车,输出字符串,没有变量,会默认保存到$REPLY中
16 $SECONDS计时,输出当前脚本的运行时间
17 $GLOBIGNORE忽略通配符的某些模式,例如 GLOBIGNORE=*.gif则ls 不在输出.gif结尾的图片的名字
18 $IFS设置分隔符,默认是空格,回车,可以改为冒号,有时很有用,比如冒号分割的密码
19 TMOUT=6 超时退出,防止管理员离开忘记exit root密码
20 通配符创建多文件 touch a{1,2,3}.txt
21 -O $filename测试文件是否属于当前用户,-G 用户组
22 stat -c %U file 获取文件所属用户 %G用户组
23 if [[ =~ ]]表示正则
for name in /home/danding/myscripts/*
do
nn=`basename $name`
if [[ $nn =~ ^a.* ]];then
echo $nn
else
echo "this is no .sh file"
fi
done
24 case的用法;;结尾
read -p "please input the number?" item
case $item in
1) echo "this is 1 num" ;;
2) echo "this is 2 num";;
*) echo "the other input";;
esac
1)可以用正则 a.*) ;;&多个条件匹配
25 for循环可以用((i<=10)) ((i+=1)) $i=$(($i+1)) let i=$i+1 $i=`expr $i+1`
ping -c1 -w1
26 ${1:-sdf}表明为第一个参数提供默认值,${var:-dfsf} var没有定义时,默认为dfsf
27 break 2 跳出两层循环
28 select item in 制作菜单很管用
29 x=hello y=2 echo $x+$y 自动把文本变为0 但是expr不会,报异常
30 ${#var} 变量长度,字符串长度
31 ${var:3:2}变量的裁剪,3表示起始位置,2表示长度,可以不写表示到结尾,也可以为负数,最后一个字符是-1,类推
32 正则,模式裁剪。
${variable#word} 从开头非贪婪模式匹配
${variable##word} 开头贪婪模式匹配
${variable%word} 从结尾非贪婪模式匹配
${variable%%word} 结尾非贪婪模式匹配
phone="555-456-1414"
${phone#*-} //456-1414
${phone##*-} //1414
${phone%-*} //555-456
${phone%%-*} //555
从头裁剪的意思是从头减掉不要;从尾裁剪的意思是从尾减掉不要
33 sed命令和选项:
a\ 在当前行后添加一行或多行
c\ 用新文本替换当前行中的文本
d 删除行
i\ 在当前行之前插入文本
h 把模式空间的内容复制到暂存缓冲区
H 把模式空间的内容添加到缓冲区
g 取出暂存缓冲区的内容,将其复制到模式缓冲区
G 取出暂存缓冲区的内容,将其追加到模式缓冲区
l 列出非打印字符
p 打印行
n 读入下一行输入,并从下一条而不是第一条命令对其处理
q 结束或退出sed
r 从文件中读取输入行
! 对所选行以外的行应用所有命令
s 用一个字符串替换另外一个字符串
替换标志:
g 在行内进行全局替换
p 打印行
w 将行写入文件
x 交换暂存缓冲区和模式空间的内容
y 将字符转换成另外一个字符
sed例子:
打印:p命令
sed ‘/abc/p’ file
打印file中包含abc的行。默认情况sed把所有行都打印到屏幕,如果某行匹配到模式,则把该行另外再打印一遍
sed -n ‘/abc/p’ file 和上面一样,只是去掉了sed的默认行为,只会打印匹配的行
删除:d命令
sed ‘3,$d’ file 删除从第3行到最后一行的内容。
sed ‘$d’ file 删除最后一行的内容
sed ‘/abc/d’ 删除包含abc的行。
sed ‘3d’ file 删除第三行的内容
替换:s命令
sed ‘s/abc/def/g’ file 把行内的所有abc替换成def,如果没有g,则只替换行内的第一个abc
sed -n ‘s/abc/def/p’ file 只打印发生替换的那些行
sed ‘s/abc/&def/’ file 在所有的abc后面添加def(&表示匹配的内容)
sed -n ‘s/abc/def/gp’ file 把所有的abc替换成def,并打印发生替换的那些行
sed ‘s#abc#def#g’ file 把所有的abc替换成def,跟在替换s后面的字符就是查找串和
替换串之间的分割字符,本例中试#
指定行的范围:逗号
sed -n ‘/abc/,/def/p’ file 打印模式abc到def的行
sed -n ‘5/,/def/p’ file 打印从第五行到包含def行之间的行。
sed /abd/,/def/s/aaa/bbb/g 修改从模式abc到模式def之间的行,把aaa替换成def
多重编辑-e
sed -e ‘1,3d’ -e ‘s/abc/def/g’ file 删除1-3行,然后把其余行的abc替换成def
读文件:r命令
sed ‘/abc/r newfile’ file 在包含abc的行后读入newfile的内容
写文件:w命令
sed ‘/abc/w newfile’ file 在包含abc的行写入newfile
追加:a命令
sed ‘/abc/a\def’ file 在包含abc的行后新起一行,写入def
插入:i命令
sed ‘/abc/i\def’ file 在包含abc的行前新起一行,写入def
修改:c命令
sed ‘/abc/c\def’ file 在包含abc的行替换成def,旧文本被覆盖
读取下一行:n命令
sed ‘/abc/{n ; s/aaa/bbb/g;}’ file 读取包含abc的行的下一行,替换aaa为bbb
转换:y命令
sed ‘y/abc/ABC’ file 将a替换成A,b替换成B,c替换成C(正则表达式元字符不起作用)
退出:q命令
sed ‘/abc/{ s/aaa/bbb/ ;q; }’ file 在某行包含了abc,把aaa替换成bbb,然后退出sed。
暂存和取用:h命令(把模式行存储到暂存缓冲区)和g(取出暂存缓冲区的行并覆盖模式缓冲区)G(取出临时缓冲区的行)命令
h和g是复制行为(覆盖),H和G表示追加。
sed -e ‘/abc/h’ -e ‘$G’ file 包含abc的行通过h命令保存到暂存缓冲区,在第二条命令汇中,sed读到最后一行$时,G命令从暂存缓冲区中读取一行,追加到模式缓冲区的后面。即所有包含abc的行的最后一行被复制到文件末尾。
sed -e ‘/abc/{h; d;}’
-e ‘/def/{g; }’ file 包含abc的行会移到包含def的行上,并进行覆盖。
暂存和互换:h和x命令
sed -e ‘/abc/h’
-e ‘/def/x’ file 包含abc的行会被换成def的行。
34 shell自带的字符串替换
${var/abc/def}会把第一abc替换成def,若要全局匹配用// ${var//abc/def} #表示开头,%表示末尾 ${var/#abc/def} 把开头是abc的换成def ${var/%abc/def} 把结尾......脱字符号^用于修改变量的大小写
模式删除: 第二个不写 ${var/abc}就是删除第一个abc
35 大小写转换,要是转化为大写,用 ${var^^} ,要是转化为小写${var,,}
36 ${var:-word}提供默认值${var?word}也是,${var+word}表示var有值,输出word,否则都为空
37 简介操作:
变量的变量执行;一个变量的是PATH,想返回PATH变量的内容,
myvar=PATH
echo ${!myvar}
返回/usr/lib/qt-3.3/bin:/usr/local/bin:/usr/bin:/bin:/usr/local/sbin:/usr/sbin:/sbin:/home/danding/bin
不能直接${!PATH}要的是一个间接变量 ,PATH是一个直接变量
38 可以使用source引用其他文件中的变量 . /etc/sysconfig/network 使用网关,ip地址啥的
39 函数
myfunc()
{}
可加可不加function myfunc(){} 都行 ,函数调用 myfunc $var
40 bc 浮点数运算
[root@lancy bin]# echo "2.5*3.4" |bc
8.5
[root@lancy bin]# echo "5/3; 5/3.1" |bc
1
1
[root@lancy bin]# echo "scale=2; 5/3" |bc
1.66
[root@lancy bin]# echo "ibase=10;obase=2; 4*6"|bc
11000
[root@lancy bin]# echo "ibase=2; 110*101; obase=10" |bc
30
[root@lancy bin]# echo "ibase=2; 11110; obase=2" |bc
30
41 整个函数的重定向 myfunc > log.txt ;tee 命令可以同时重定向到stdout和文件
myfunc $var | tee log.txt
42 mktemp产生临时文件的命令 temp=`mktemp`
43 #!/bin/bash
if [ $# -lt 1 ]
then
echo "there is no option";
else
while getopts ":Iti:s:v" opt;
do
case $opt in
I)echo "option is I "
;;
t)echo "option is t "
;;
i)ii=$OPTARG;echo "option is i,the value is $ii";
;;
s)ss=$OPTARG;echo "option is s ,the value is $ss";
;;
v)echo "option is v \n";
;;
:)
echo ">>> Error: '-$OPTARG' requires an argument"
;;
?)paralist=-1;
echo ">>> Error: '-$OPTARG' not supported,please input valid argument [Itisv]"
;;
esac
done
fi
下面给出几个执行的例子:
(1)sh datediff.sh -i 1 -I -v
option is i,the value is 1
option is I
option is v \n
(2)sh datediff.sh -s -i 1
option is s, the value is -i //取s选项后的值
(3)sh datediff.sh -s //选项中有前置冒号
>>> Error: '-s' requires an argument
sh datediff.sh -s //去除选项中的前置冒号后的输出
datediff.sh: option requires an argument -- s
44 数组赋值 arrar[0]=adf
一次性赋值 arr=(ad d f erw lj)
命令赋值 stat=($(cat /proc/stat)) 或者stat=(`cat /proc/stat`)
可用IFS设置换行符,一行一行读
oldIFS=$IFS
IFS="
"
hosts=(`cat /etc/hosts`)
for hostline in ${hosts[@]}
do
echo line: $hostline
done
IFS=$oldIFS
还可以是通配符 arr=(*.mp3)
从流读取 read -a 能把输入流读入到数组
read -a 和IFS联合使用,效果更佳,比如读取/etc/passwd是冒号分割的
IFS和read放在同一行,只对read起作用,更安全
while IFS=: read -a userdetails
do
done
45 readarray 能更好的处理数组 readarray -n 4 -s 2 food
-n 指定读取的最大行数 -s 从输入的开头跳过几行,-O 指定初始索引值 -t 去掉换行符
数组的访问 ${arr[0]}
数组的长度 ${#array[@]}
数组的截取 ${array[@]:2:3}
关联数组
用declare -A array 声明
array=([singer]="john") 反向引用 ${!array[john]}
数组的复制 hobbies=(${activities[@]})
追加hobbies=(${activities[@]} diving)也可以用+=
46 $$指的是当前进程id ls -l /proc/$$/fd
有四个文件 0 1 2 255 0表示stdin 1表示stdout 2stderr
exec 3> /temp/testing 创建文件描述符3
就可以echo " sdfsdf" >&3 多次运行只是追加不能清空,清空用>/temp/testing
47 命令后面加上&符号,表示此命令后台运行,可用$!返回后台进程ID ps -fp $!
48 ps -fp $! 查看后台进程 ,事前可以跑一个sleep 100
49 jobs -l 显示后台进程 fg %2 把作业2提到前台 bg %2 把作业2放到后台 kill -9 % 关闭任何作业号 wait 等待作业完成
50 stat 文件状态 stat -c %s file
51 cat -n file指定行
52 join 命令 归并两个有序文件 研究下paste 也是合并
53 tr 流替换
54 uniq 独立的
55 factor 因子分解
56 id user 查看id groups user
相关文章推荐
- Shell脚本学习指南笔记
- 【Linux】Shell学习笔记之一——安装配制
- Shell学习笔记
- SHELL学习笔记(3)
- shell之学习笔记
- 【Shell】【学习笔记】Linux Shell脚本应用(五)
- 学习笔记——shell中的引号和括号使用的总结
- Shell学习笔记(一)
- shell脚本学习笔记(符号)
- Shell学习笔记---变量赋值与运算---待完善
- shell学习笔记[grep,sed,awk,sort,for,until,while]
- shell shell学习笔记001--什么是shell?
- shell学习笔记(2) 一个简单的shell脚本程序
- shell脚本学习笔记
- shell学习笔记【原创】
- Shell脚本学习笔记-条件判断
- LINUX系统学习笔记管道符和作业控制 ,shell变量 , 环境变量配置文件
- SHELL学习笔记----IF条件判断,判断条件
- Linux学习笔记-shell命令[转帖]
- 《java in a nutshell》的一些学习笔记