shell总结

Posted lu0420-0412

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了shell总结相关的知识,希望对你有一定的参考价值。

shell是一个命令行解释器,它接收应用程序/用户命令,然后调用操作系统内核。

shell还是一个功能强大的编程语言,易编写,易调试,灵活性强。

Shell解析器有:

 

/bin/sh

 

/bin/bash

/bin/dash

/bin/tcsh

/bin/csh

 Shell中的变量

 

 

1. 常用系统变量

 

$HOME$PWD$SHELL$USER

 

2. 自定义变量

 

1.基本语法

 

1)定义变量:变量= 

 

2)撤销变量:unset 变量

 

3)声明静态变量:readonly变量,注意:不能unset

 

2.变量定义规则

 

1)变量名称可以由字母、数字和下划线组成,但是不能以数字开头,环境变量名建议大写

 

2)等号两侧不能有空格

 

3bash中,变量默认类型都是字符串类型,无法直接进行数值运算。

 

4)变量的值如果有空格,需要使用双引号或单引号括起来。

 

3.案例实操

 

1)定义变量A

 

[jinghnag@hadoop101 datas]$ A=5

 

[jinghnag@hadoop101 datas]$ echo $A

 

5

 

2变量A重新赋值

 

[jinghnag@hadoop101 datas]$ A=8

 

[jinghnag@hadoop101 datas]$ echo $A

 

8

 

3)撤销变量A

 

[jinghnag@hadoop101 datas]$ unset A

 

[jinghnag@hadoop101 datas]$ echo $A

 

4)声明静态的变量B=2,不能unset

 

[jinghnag@hadoop101 datas]$ readonly B=2

 

[jinghnag@hadoop101 datas]$ echo $B

 

2

 

[jinghnag@hadoop101 datas]$ B=9

 

-bash: B: readonly variable

 

5bash中,变量默认类型都是字符串类型,无法直接进行数值运算

 

[jinghnag@hadoop101 ~]$ C=1+2

 

[jinghnag@hadoop101 ~]$ echo $C

 

1+2

 

6变量的值如果有空格,需要使用双引号或单引号括起来

 

[jinghnag@hadoop101 ~]$ D=I love banzhang

 

-bash: world: command not found

 

[jinghnag@hadoop101 ~]$ D="I love banzhang"

 

[jinghnag@hadoop101 ~]$ echo $A

 

I love banzhang

 

7)可把变量提升为全局环境变量,可供其他Shell程序使用

 

export 变量名

 

[jinghnag@hadoop101 datas]$ vim helloworld.sh

 

 

 

在helloworld.sh文件中增加echo $B

 

#!/bin/bash

 

 

 

echo "helloworld"

 

echo $B

 

 

 

[jinghnag@hadoop101 datas]$ ./helloworld.sh

 

Helloworld

 

发现并没有打印输出变量B的值

 

[jinghnag@hadoop101 datas]$ export B

 

[jinghnag@hadoop101 datas]$ ./helloworld.sh

 

helloworld

 

2

3 特殊变量$n

 

 

 

 

 

$n (功能描述:n为数字,$0代表该脚本名称$1-$9代表第一到第九个参数,十以上的参数,十以上的参数需要用大括号包含,如${10}

 

1)输出该脚本文件名称输入参数1和输入参数2 的

 

[jinghnag@hadoop101 datas]$ touch parameter.sh

 

[jinghnag@hadoop101 datas]$ vim parameter.sh

 

 

 

#!/bin/bash

 

echo "$0  $1   $2"

 

 

 

[jinghnag@hadoop101 datas]$ chmod 777 parameter.sh

 

 

 

[jinghnag@hadoop101 datas]$ ./parameter.sh cls  xz

 

./parameter.sh  cls   xz

 

$# (功能描述:获取所有输入参数个数,常用于循环

[jinghnag@hadoop101 datas]$ vim parameter.sh

 

#!/bin/bash

echo "$0  $1   $2"

echo $#

 

[jinghnag@hadoop101 datas]$ chmod 777 parameter.sh

 

[jinghnag@hadoop101 datas]$ ./parameter.sh cls  xz

parameter.sh cls xz

2

$* (功能描述:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体)

$@ (功能描述:这个变量也代表命令行中所有的参数,不过$@把每个参数区分对待)

 

打印输入所有参数

 

[jinghnag@hadoop101 datas]$ vim parameter.sh

 

 

 

#!/bin/bash

 

echo "$0  $1   $2"

 

echo $#

 

echo $*

 

echo $@

 

 

 

[jinghnag@hadoop101 datas]$ bash parameter.sh 1 2 3

 

parameter.sh  1   2

 

3

 

1 2 3

 

1 2 3

$ (功能描述:最后一次执行的命令的返回状态。如果这个变量的值为0,证明上一个命令正确执行;如果这个变量的值为非0(具体是哪个数,由命令自己来决定),则证明上一个命令执行不正确了。)

 

判断helloworld.sh脚本是否正确执行

 

[jinghnag@hadoop101 datas]$ ./helloworld.sh

 

hello world

 

[jinghnag@hadoop101 datas]$ echo $?

 

0

运算符

 

 

 

1.基本语法

 

1“$((运算式))”“$[运算式]”  + , - , *,  /,  %    加,乘,除,取余

 

2expr  + , - , *,  /,  %    ,乘,除,取余

 

注意:expr运算符间要有空格

 

2.案例实操:

 

(1)计算3+2的值

 

[jinghnag@hadoop101 datas]$ expr 2 + 3

 

5

 

(2)计算3-2的值

 

[jinghnag@hadoop101 datas]$ expr 3 - 2

 

1

 

(3)计算(2+3X4的值

 

aexpr一步完成计算

 

[jinghnag@hadoop101 datas]$ expr `expr 2 + 3` * 4

 

20

 

b)采用$[运算式]方式

 

[jinghnag@hadoop101 datas]# S=$[(2+3)*4]

 

[jinghnag@hadoop101 datas]# echo $S

条件判断

 

 

1.基本语法

 

[ condition ]注意condition前后要有空格

 

注意:条件非空即为true[ jinghnag ]返回true[] 返回false

 

2. 常用判断条件

 

1两个整数之间比较

 

= 字符串比较

 

-lt 小于(less than) -le 小于等于less equal)

 

-eq 等于(equal) -gt 大于(greater than)

 

-ge 大于等于greater equal) -ne 不等于(Not equal)

 

2按照文件权限进行判断

 

-r 有读的权限read -w 有写的权限write

 

-x 有执行的权限(execute)

 

3按照文件类型进行判断

 

-f 文件存在并且是一个常规的文件file

 

-e 文件存在(existence) -d 文件存在并是一个目录(directory)

 

3.案例实操

 

123是否大于等于22

 

[jinghnag@hadoop101 datas]$ [ 23 -ge 22 ]

 

[jinghnag@hadoop101 datas]$ echo $?

 

0

 

2helloworld.sh是否具有写权限

 

[jinghnag@hadoop101 datas]$ [ -w helloworld.sh ]

 

[jinghnag@hadoop101 datas]$ echo $?

 

0

 

3/home/jinghnag/cls.txt目录中的文件是否存在

 

[jinghnag@hadoop101 datas]$ [ -e /home/jinghnag/cls.txt ]

 

[jinghnag@hadoop101 datas]$ echo $?

 

1

 

(4)多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令

 

[jinghnag@hadoop101 ~]$ [ condition ] && echo OK || echo notok

 

OK

 

[jinghnag@hadoop101 datas]$ [ condition ] && [ ] || echo notok

 

notok

流程控制

 

if 判断

 

1.基本语法

 

if [ 条件判断式 ];then

 

  程序

 

fi

 

或者

 

if [ 条件判断式 ]

 

  then

 

    程序

 

elif [ 条件判断式 ]

 

then

 

程序

 

else

 

程序

 

fi

 

注意事项:

 

1[ 条件判断式 ],中括号和条件判断式之间必须有空格

 

2if后要有空格

 

2.案例实操

 

1)输入一个数字如果1则输出banzhang zhen shuai,如果是2,则输出cls zhen mei,如果是其它,什么也不输出。

 

[jinghnag@hadoop101 datas]$ touch if.sh

 

[jinghnag@hadoop101 datas]$ vim if.sh

 

 

 

#!/bin/bash

 

 

 

if [ $1 -eq "1" ]

 

then

 

        echo "banzhang zhen shuai"

 

elif [ $1 -eq "2" ]

 

then

 

        echo "cls zhen mei"

 

fi

 

 

 

[jinghnag@hadoop101 datas]$ chmod 777 if.sh

 

[jinghnag@hadoop101 datas]$ ./if.sh 1

 

banzhang zhen shuai

case 语句

1.基本语法

case $变量名 in

  "1"

    如果变量的值等于值1,则执行程序1

    ;;

  "2"

    如果变量的值等于值2,则执行程序2

    ;;

  …省略其他分支

  *

    如果变量的值都不是以上的值,则执行此程序

    ;;

esac

注意事项:

1) case行尾必须为单词“in”,每一个模式匹配必须以右括号“)”结束。

2) 双分号;;”表示命令序列结束,相当于java中的break

3) 最后的*)”表示默认模式,相当于java中的default。

2.案例实操

1)输入一个数字如果1,则输出banzhang,如果是2,则输出cls,如果是其它输出renyao

[jinghnag@hadoop101 datas]$ touch case.sh

[jinghnag@hadoop101 datas]$ vim case.sh

 

!/bin/bash

 

case $1 in

"1")

        echo "banzhang"

;;

 

"2")

        echo "cls"

;;

*)

        echo "renyao"

;;

esac

 

[jinghnag@hadoop101 datas]$ chmod 777 case.sh

[jinghnag@hadoop101 datas]$ ./case.sh 1

1

 for 循环

1.基本语法1

for (( 初始值;循环控制条件;变量变化 ))

  do

    程序

  done

2.案例实操

1)从1加到100

[jinghnag@hadoop101 datas]$ touch for1.sh

[jinghnag@hadoop101 datas]$ vim for1.sh

 

#!/bin/bash

 

s=0

for((i=0;i<=100;i++))

do

        s=$[$s+$i]

done

echo $s

 

[jinghnag@hadoop101 datas]$ chmod 777 for1.sh

[jinghnag@hadoop101 datas]$ ./for1.sh

“5050”

3.基本语法2

for 变量 in 1 2 3…

  do

    程序

  done

4.案例实操

1)打印所有输入参数

[jinghnag@hadoop101 datas]$ touch for2.sh

[jinghnag@hadoop101 datas]$ vim for2.sh

 

#!/bin/bash

#打印数字

 

for i in $*

    do

      echo "ban zhang love $i "

    done

 

[jinghnag@hadoop101 datas]$ chmod 777 for2.sh

[jinghnag@hadoop101 datas]$ bash for2.sh cls xz bd

ban zhang love cls

ban zhang love xz

ban zhang love bd

while 循环

1.基本语法

while [ 条件判断式 ]

  do

    程序

  done

2.案例实操

1)从1加到100

[jinghnag@hadoop101 datas]$ touch while.sh

[jinghnag@hadoop101 datas]$ vim while.sh

 

#!/bin/bash

s=0

i=1

while [ $i -le 100 ]

do

        s=$[$s+$i]

        i=$[$i+1]

done

 

echo $s

 

[jinghnag@hadoop101 datas]$ chmod 777 while.sh

[jinghnag@hadoop101 datas]$ ./while.sh

5050

 Shell工具

cut的工作就是,具体的说就是在文件中负责剪切数据用的。cut 命令从文件的每一行剪切字节、字符和字段并将这些字节、字符和字段输出。

1.基本用法

cut [选项参数]  filename

说明:默认分隔符是制表符

2.选项参数说明

 

选项参数

功能

-f

列号,提取第几列

-d

分隔符,按照指定分隔符分割列

-c

指定具体的字符

 

ed是一种编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”,接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。

 

  1. 基本用法

 

sed [选项参数]  ‘command’  filename

 

  1. 选项参数说

 

 

 

选项参数

功能

-e

直接在指令列模式上进行sed的动作编辑。

-i

直接编辑文件

 

  1. 命令功能描述

 

 

 

命令

功能描述

a 

新增,a的后面可以接字串,在下一行出现

d

删除

s

查找并替换 

 

awk

 

一个强大的文本分析工具,把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行分析处理。

 

  1. 基本用法

 

awk [选项参数] ‘pattern1{action1}  pattern2{action2}...filename

 

pattern:表示AWK在数据中查找的内容,就是匹配模式

 

action:在找到匹配内容时所执行的一系列命令

 

  1. 选项参数说

 

 

 

选项参数

功能

-F

指定输入文件折分隔符

-v

赋值一个用户定义变量

 

sort命令是在Linux里非常有用,它将文件进行排序,并将排序结果标准输出。

 

  1. 基本语法

 

sort(选项)(参数)

 

 

 

选项

说明

-n

依照数值的大小排序

-r

以相反的顺序来排序

-t

设置排序时所用的分隔字符

-k

指定需要排序的列

 

参数:指定待排序的文件列表

shell脚本

1.写一个脚本输入任意数组或则数字例如 2 3 4 5 6 7 8 9,输出最大值、最小值、平均值
#!/bin/bash
min=$1
max=$1
sum=0
for i in "$@"
do
if [ $min -gt $i ]
then
min=$i
fi
if [ $max -lt $i ]
then
max=$i
fi
sum=$[$sum+$i]
done
echo "最大值为" $max
echo "最小值为" $min
echo "平均值为" $[$sum/$#]
2.写一个脚本输入任意数组或则数字例如 2 4 3 5 9 7 8 6,按照从小到大排序后输出
#!/bin/bash
arr=()
i=0
for value in "$@"
do
arr[$i]=$value
i=$[$i+1]
done

echo ${arr[*]}

for ((i=0;i<${#arr[@]};i++))
do
for ((j=$i;j<${#arr[@]};j++))
do
tmpvalue=${arr[$i]}
if [ ${arr[$j]} -lt $tmpvalue ]
then
arr[$i]=${arr[$j]}
arr[$j]=$tmpvalue
fi
done
done

echo ${arr[@]}

shell面试题

 

百度脚本面试题

 

1)写脚本实现,可以用shell、perl等。在目录/tmp下找到100个以abc开头的文件,然后把这些文件的第一行保存到文件new中。

 

参考答案1:

 

[plain] view plaincopy
 
 
  1. #!/bin/sh  
  2. for filename in `find /tmp -type f -name "abc*"|head -n 100`  
  3. do  
  4. sed -n ‘1p‘ $filename>>new  
  5. done  
解析:第一,用到了find命令,其中-type f表示选取普通文件,-name用于设定文件名;第二,head -n 100命令用于取出前100项。第三,sed -n ’1p’用于取出文件的第一行内容。第四,>>new表示追加到文件new中。
参考答案2:
[plain] view plaincopy
 
 
  1. find /tmp -type f -name “abc*” | head -n 100 | xargs head -q -n 1 >> new  

 

2)写脚本实现,可以用shell、perl等。把文件b中有的,但是文件a中没有的所有行,保存为文件c,并统计c的行数。 

 

参考答案:
[plain] view plaincopy
 
 
  1. grep -vxFf a b | tee c | wc -l  
解析:grep选取-v表示不选择匹配的行,-F表示匹配的模式按行分割,-f a表示匹配模式来自文件a,最后表示目标文件b。即grep命令从b中选取a中不存在的行。

 

            tee c命令创建文件c,wc -l命令统计行数。
 
 
1、 用sed修改test.txt的23行test为tset;     
sed –i „23s/test/tset/g? test.txt

2、 查看/web.log第25行第三列的内容。
sed –n ‘25p’ /web.log | cut –d “ ” –f3
head –n25 /web.log | tail –n1 | cut –d “ ” –f3
awk –F “ ” ‘NR==23{print $3}’ /web.log


3、 删除每个临时文件的最初三行。
sed –i ‘1,3d’ /tmp/*.tmp


4、 脚本编程:求100内的质数。
#!/bin/bash
i=1
while [ $i -le 100 ];do
ret=1
for (( j=2;j<$i;j++ ));do
if [ $(($i%$j)) -eq 0 ];then
ret=0
break
fi
done
if [ $ret -eq 1 ];then
echo -n "$i "
fi
i=$(( i+1 ))
done


5、 晚上11点到早上8点之间每两个小时查看一次系统日期与时间,写出具体配置命令
echo 1 23,1-8/2 * * * root /tmp/walldate.sh >> /etc/crontab


6、 编写个shell脚本将当前目录下大于10K的文件转移到/tmp目录下
#!/bin/bash
fileinfo=($(du ./*))
length=${#fileinfo[@]}
for((i=0;i<$length;i=$(( i+2 ))));do
if [ ${fileinfo[$i]} -le 10 ];then
mv ${fileinfo[$(( i+1 ))]} /tmp
fi
done


7、 如何将本地80端口的请求转发到8080端口,当前主机IP为192.168.2.1
/sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -j DNAT --to 192.168.2.1:8080
/sbin/iptables -t nat -A PREROUTING -p tcp --dport 80 -j REDIRECT --to 8080


8、 在11月份内,每天的早上6点到12点中,每隔2小时执行一次/usr/bin/httpd.sh 怎么实现
echo "1 6-12/2 * * * root /usr/bin/httpd.sh >> /etc/crontab"


9、 在shell环境如何杀死一个进程?
ps aux | grep | cut -f? 得到pid
cat /proc/pid
kill pid


10、 在shell环境如何查找一个文件?
find / -name abc.txt


11、 在shell里如何新建一个文件?
touch ~/newfile.txt

 

以上是关于shell总结的主要内容,如果未能解决你的问题,请参考以下文章

shell总结

shell总结

Shell总结11-shell运行模式

Bash shell 特点总结

shell总结

shell命令总结