shell中的变量:
系统变量和用户自定义变量(linux使用set命令查看所有变量)
自定义变量:
格式:变量名=值
初始化变量时,可以使用双引号对空格脱意
x=“hello world”
使用$加变量名的方式调用一个变量
>>>$x
hello world
使用单引号将所有特殊字符进行脱意,所以在单引号的变量中不可以引用变量
>>>a='hello $x'
hello $x
shell编程中使用export 加变量名的方式,是一个变量成为全局变量,供其他程序调用
可以使用:变量名=`执行有输出的命令` 的方式将命令执行结果传给一个变量名或者使用变量名=$(执行有输出的命令)
特殊变量:
$?--->表示上一个命令的返回值
$n(n>=1)--->表示n位置传入的参数
$0--->表示当前脚本名称
$#--->表示参数的个数(常用于循环)
$*/$@--->表示所有参数列表(常用于循环)
如果对这两个加双引号:$*会将所有参数看成一个字符串,而$@则仍然是把参数分开
循环结构:
for循环:
for 变量名(如i) in 循环的值或参数列表(如:$*)
do
echo $i
done
while循环:
while [ boolean表达式 ]
do
done
选择结构:
if语句:
if [ 表达式 ]
then
echo 'success'
【elif [ 表达式 ]
then
echo "ok"
else
echo "no"】
fi
【】中的内容是可选项
case语句:
case $1 in
条件值1)
echo 'run'
;;
条件值2)
echo 'run'
;;
*)
echo 'no run'
esac
运算符:
expr 运算表达式 s=`expr 2+3`
或者直接使用$(运算表达式) 例如:$(((2+3)*4))
read命令:用于交互式的输入
例如:read -t 等待时间 -p"提示信息" 【 接收输入的变量名】
>>>read -p "test:" num
test:hello
>>>echo $num
hello
判断语句:
格式:[ ]
常用判断运算符:
= 用于字符串的比较
-lt 小于
-le 小于等于
-eq 等于
-gt 大于
-ge 大于等于
-ne 不等于
-f 后面跟文件名,用于判断文件是否存在
-w 是否存在且可写
-d 是否为目录
-x 是否存在且可执行
自定义函数:
function 函数名test()
{
(如果传递参数,则使用$1,$2···)
return int型结果
}
test() 1 2;----函数调用
total=$?;----获取返回值 使用$?获取返回值
需要注意的是,在函数调用之前一定先在前面有了定义声明,因为shell执行代码是逐行执行的
脚本的调试:sh -vx 脚本名
文本处理:
cut:用于分割文本内容,然后打印到标准输出
格式:cut -d '分隔符' -f 索引值(类似java分割后使用数组进行获取)
取分割后的第一列
eq:echo $PATH | cut -d ':' -f 1
/usr/local/sbin
取分割后的第一列和第五列
eq:echo $PATH | cut -d ':' -f 1,5
/usr/local/sbin:/root/bin
取分割后的3到最后一列
eq:echo $PATH | cut -d ':' -f 3-
/usr/sbin:/usr/bin:/root/bin
取分割后的第一到三列
eq:echo $PATH | cut -d ':' -f 1-3
/usr/local/sbin:/usr/local/bin:/usr/sbin
sed:
流式文本编辑器,配合正则表达式对文本进行处理(一行一行处理)
通过实例学习:
d命令:
sed '2d' file 删除file文本中的第二行
sed '2,$d' file 删除file文本中第二行到最后一行
sed '$d' file 删除file文本中的最后一行
sed '/word/d' file 删除file文本中的匹配到双斜杠中内容的行
s命令:
sed 's/test/word/' file 将file文本中第一个“test”用“word”替换
sed 's/test/word/g' file “g”的作用是将file文本中所
有“test”用“word”替换
sed 's/^test/word/' file 将file文本每行以"test''开头内容用word替换
sed -n 's/test/word/p' file 将发生过替换的行打印到标准输出(-n与p命令搭配使用)
sed 's/^test/&word/' file 使用&命令将file文本中以"test"开头的内容后追加到该匹配符后,如testword(不替换,仅追加)
sed -n 's/\(te\)st/\1word/p' file 部分替换,使用括号进行标记,第一个括号标记为1,第二个括号标记为2,使用“\”转义字符对括号和标记数字进行转义,替换的是除括号以外的部分这里是“st”,替换成“teword”
","逗号:选定行范围
sed -n '2,/test/p' file 将文本中第二行到第一个匹配到test的行打印到标准输出
sed -n '/test/,/test2/s/$/word/p' file 将file文本中第一个匹配到的test行与第一个匹配到test2之间行(包含test2行)的末尾($)用word替换(追加)
eq: cat testfile
hello cat
world word
hello word
wode hell
world
what
sed -n '/he/,/wode/s/$/test/p' testfile
hello cattest
world wordtest
hello word test
wode helltest
-e命令:用于执行多个sed命令
awk:
文本分析工具,它用于文本内容逐行读入,以默认空格分隔符对每行进行切割,将切开的部分进行各种分析。
单从定义来看很难理解,我们通过示例学习:
打印前一个命令输出文本的第一列
eq:[root@study ~]# last -n 5 | awk {'print $1'}
root
root
root
root
reboot
打印/etc/passwd 文本中以":"分割开的第一列内容
eq:[root@study ~]# cat /etc/passwd | awk -F ':' {'print $1'}
root
bin
daemon
···
sort命令:
在shell编程中可能会对文本进行排序操作,这就需要用到sort命令
sort 默认是对文本中的行,按字典顺序排序
如果需要指定排序规则,就要用到-t 先将文本中的每一行分割,-k 指定按分割后的第几列排序 默认按字典顺序排序,-k 3n 按数字大小排序
eq:sort /etc/passwd -t ':' -k 3n(将每行分割,并将第三部分按数字大小排序)
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
eq:vi testfile
hello
world
hello
wode
world
what
sort testfile
hello
hello
what
wode
world
world
sort testfile | uniq(用于排序后的去除重复行)
hello
what
wode
world
sort testfile | uniq -c(-c的作用是去除重复并统计出现的个数)
2 hello
1 what
1 wode
2 world
wc命令:
有时我们需要对文本中的内容进行统计,wc即可满足统计的要求
-l:统计文本中的行
-c:统计文本字节数
-m:用于统计文本字符数
-w:用于统计文本中单词数
未完待续...