shell脚本系列

1.执行shell脚本的两种方式
(1)bash demo.sh(sh demo.sh)
(2)chmod u+x demo.sh
     ./demo.sh

2.变量删除:unset

3.格式问题
(1)=左右不能有空格
(2)+运算符左右必须有空格
(3)==左右必须要有空格:[ $a == $b ]


4.在shell脚本中执行Lunix命令:
(1)使用$()
(2)使用反引号``

1 基础


Shell是用户使用lunix的桥梁
Bash是大多数Lunix系统默认的shell
#!/bin/bash:其中#!是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种shell.

echo命令用于向窗口输出文本。

1.shell变量:
(1)不能用$
(2)只能用字母数字下划线,不能以数字开头,不能有空格
(1)=前后不能有空格
(2)readonly:只读变量
(3)unset:删除变量(不能删除只读变量)
(4)使用#获取字符串长度echo ${#string }
(5)截取字符串:echo ${string : 1 :4}  (字符串索引从零开始)
(6)shell脚本中定义的变量都是全局的,但是可以用local在函数中声明局部变量(出了函数就不生效了)


2.shell数组
Bush仅支持一维数组
定义数组:array_name=(1 2 3 4 5 6)
读取数组:value=${array_name[2]}
可以用@获取数组所有元素:echo ${array_name[@]}
获取数组的长度:length=${array_name[@]}

单行注释:
#
多行注释:
:<<!
注释内容
!


3.shell传递参数
在执行脚本文件时可以为其传递参数
$#:表示参数传递的个数
$*:将传递的参数作为字符串显示

4.shell运算符
通过expr或awk来实现算术运算
val=`expr 2 + 2`
echo “两数之和为:$val”
表达式于运算符必须要有空格,如:2 + 2
(1)关系运算符:-eq、-ne、-gt、-lt、-ge、-le
(2)布尔运算符
!非
-o 或
-a 与
(3)逻辑运算符
&& 逻辑的and
|| 逻辑的or

例:
Command1 && command2  &&表示只有command1为true时才会执行command2
Command1 || command2   ||表示只有command1为false时才会执行command2
如果希望把几个命令合在一起执行用():( command1;command2 )

(1)字符串运算符
= 两个字符串是否相等
!= 两个字符串是否不相等
-z字符串长度是否为0
-n字符串长度是否不为0
$ 检测字符串是否为空
(2)文件测试运算符


5.shell的echo用法:
将显示结果定向至文件echo “It is a test” >myfile
显示命令执行结果:echo `date`


6.shell的test命令
用于检查某个条件是否成立
num1=100
num2=100
If test $[num1] -eq $[num2]
then 
   echo ‘两个数相等’
else 
   echo ‘两个数不相等’
fi


7.shell流程控制
(1)条件判断语句
if  condition1
then
    command1
elif  condition2
then
    command2
else
    command3
fi

注意:
if [  “$i” -eq 5  ]
  then
   break
fi
其中的if和小括号[]之间必须要有空格,不然会报错,而且小括号里面的表达式也需要与小括号有空格。

(1)for循环
for loop in 1 2 3 4
do
   echo “The value is: $loop”
done

(2)while语句
int 1
while(($int<=5))
do
   echo $int
   let “int++”
done

(3)unit循环
与普通循环恰恰相反,unit循环当条件为false时才执行方法体
a=0
until [ !$a -lt 10]
do
   echo $a
   a=`expr $a + 1`
done

(4)case ...esac多分支选择语句
与switch...case类似
site=”runoob”
case “$site” in
  “runoob”) echo “菜鸟教程”
  ;;
  “google”) echo “Google网”
  ;;
  “taobao” echo “淘宝网”
  ;;
esac 

(5)break和continue
与java一致

8.shell函数
function  demo(){
a=$1
b=$2
return $(($a+$b))
}
demo  1 2
echo “两数之和为 $?”

函数的返回值在调用该函数后通过$?来获得
(1)函数参数
在调用函数的时候何以为其传递参数
fundemo 1 2
$10不能获取第10个参数,获取第10个参数需要用${10},当n>=10时,需要使用${n}来获取参数

9.shell输入输出重定向
(1)输出重定向
echo “菜鸟www” > users
cat users
菜鸟www

如果不希望文件内容被新内容覆盖,可以使用>>
echo “菜鸟www” >> users
cat users
菜鸟www
菜鸟www

(2)输入重定向
command < file
(3)如果希望执行某个命令,但又不希望在屏幕上显示输出结果,那么可以
将输出重定向到/dev/null   &>/dev/null

10.shell文件包含
Shell可以包含外部脚本
test1.sh
a=1

test2.sh
../test1.sh
echo “变量的值为$a”
可以使用../test1.sh或source ./test1.sh引入文件


11.awk编程
Awk是一种处理文本的语言,是一个强大的文本分析工具
ptintf格式化输出相关参数:
(1)\t  相当于T    ab制表键
(2)\n  换行
(3)BEGIN  取开头的值
(4)END  取结尾的值
(5)NR  当前行
(6)NF  当前列
案例:
(1)输出磁盘使用情况的第一列和第三列
df -h | awk ‘{print $1 “\t” $3}’


在awk中,字符串要用//包含,awk命令才能正确识别到
例:
查找张三的年龄:
awk ‘$2 ~ /zhangsan/ {print $3}’ cut.txt

统计php成绩总值:
awk 'NR==2 {php1=$3} NR==3 {php2=$3} NR==4 {php3=$3;total=php1+php2+php3;print "total php is" total}' student.txt 

注意:在awk中,变量的赋值与调用都不需要加入$符号

统计lunix成绩几个的成员姓名:
awk '{if (NR>=2) {if ($4>60) print $2" is a good man \n"}}' student.txt 
上面代码可以简写成:
awk ‘NR>=2 {test=$4} test>90 {printf $2 "is a good man! \n"}’ student.txt


awk函数:
awk 'function test(a,b) {print a "\t" b} {test($2,$6)}' student.txt 

awk调用脚本:
将awk命令写成脚本文件进行调用:
vim pass.awk
BEGIN {FS=”:”}    
{print $1 “\t” $3}

调用:awk -f pass.awk studeent.txt


12.sed文本选取、替换、删除、新增命令
(1)指定输出第二行
sed  -n ‘2p’ student.txt
(2)删除2到4行的数据
sed  ‘2,4d’  student.txt
(3)在第二行后追加hello
sed  ‘2a hello’ student.txt
(4)在第二行前追加hello
sed  ‘2i hello’ student.txt

替换行数据:
(1)不显示第二行数据
cat student.txt | sed ‘2c  no such person’
(2)c动作是进行整行替换的,可以使用s动作替换行中部分数据,g动作是时符合条件的都替换
sed ‘3s/77/99/g’ student.txt
(3)将第二行注释掉:(^代表行首)
sed  ‘2s/^/#/g’  student.txt
(4)将name替换为空值(“-e”选项可以同时执行多个sed动作)
sed  -e  ‘s/AAA//g; s/BBB//g’ student.txt

13.sort排序:
(1)默认按照每行开头的第一个字符串进行排序
sort  student.txt 
(2)反向排序:
sort  -r student.txt
(3)按照每行的第一个数字排序
sort -n student.txt
(4)重复项只显示一项
sort -u


14.uniq取消重复行
uniq student.txt
忽略大小写:
uniq -i student.txt

15.wc统计命令
(1)统计行数
wc -l student.txt
(2)统计单词数
wc -w student.txt
(3)统计字符数
wc -m student.txt

16.shell的seq命令的作用
主要用来输出序列化的东西
(1)以空格为分隔符,输出1-10的数字:seq -s  ‘ ’ 10
(2)指定分隔符:seq -s  ‘#’ 10
(3)在数字前加0,是的宽度一样:seq -w 1 100
(4)输出-2~10以内的整数,增量为2:seq -2 2 10
(5)输出1-10之间的整数,并且可以自定义数字的宽度:
宽度为3:seq -f “%03g” 1 10
宽度为4:seq -f “%04g” 1 10
其中%前面还可以指定字符串:
seq -f “ddd%03g” 1 10
 扩展:
一次性创建5个名为dir001,dir002...dir005的目录:seq -f ‘dir%03g’ 1 5|xargs mkdir
查看刚刚创建的这5个目录:ls -l dir*

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

程序员gelei

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值