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

[ datas]$ A=5

[ datas]$ echo $A

5

2变量A重新赋值

[ datas]$ A=8

[ datas]$ echo $A

8

3)撤销变量A

[ datas]$ unset A

[ datas]$ echo $A

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

[ datas]$ readonly B=2

[ datas]$ echo $B

2

[ datas]$ B=9

-bash: B: readonly variable

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

[ ~]$ C=1+2

[ ~]$ echo $C

1+2

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

[ ~]$ D=I love banzhang

-bash: world: command not found

[ ~]$ D="I love banzhang"

[ ~]$ echo $A

I love banzhang

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

export 变量名

[ datas]$ vim helloworld.sh

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

#!/bin/bash

echo "helloworld"

echo $B

[ datas]$ ./helloworld.sh

Helloworld

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

[ datas]$ export B

[ datas]$ ./helloworld.sh

helloworld

2

3 特殊变量$n

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

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

[ datas]$ touch parameter.sh

[ datas]$ vim parameter.sh

#!/bin/bash

echo "$0  $1   $2"

[ datas]$ chmod 777 parameter.sh

[ datas]$ ./parameter.sh cls  xz

./parameter.sh  cls   xz

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

[ datas]$ vim parameter.sh

#!/bin/bash

echo "$0  $1   $2"

echo $#

[ datas]$ chmod 777 parameter.sh

[ datas]$ ./parameter.sh cls  xz

parameter.sh cls xz

2

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

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

打印输入所有参数

[ datas]$ vim parameter.sh

#!/bin/bash

echo "$0  $1   $2"

echo $#

echo $*

echo

[ datas]$ bash parameter.sh 1 2 3

parameter.sh  1   2

3

1 2 3

1 2 3

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

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

[ datas]$ ./helloworld.sh

hello world

[ datas]$ echo $?

运算符

1.基本语法

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

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

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

2.案例实操:

(1)计算3+2的值

[ datas]$ expr 2 + 3

5

(2)计算3-2的值

[ datas]$ expr 3 - 2

1

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

aexpr一步完成计算

[ datas]$ expr `expr 2 + 3` \* 4

20

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

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

[ 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

[ datas]$ [ 23 -ge 22 ]

[ datas]$ echo $?

2helloworld.sh是否具有写权限

[ datas]$ [ -w helloworld.sh ]

[ datas]$ echo $?

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

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

[ datas]$ echo $?

1

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

[ ~]$ [ condition ] && echo OK || echo notok

OK

[ 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,如果是其它,什么也不输出。

[ datas]$ touch if.sh

[ 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

[ datas]$ chmod 777 if.sh

[ 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

[ datas]$ touch case.sh

[ datas]$ vim case.sh

!/bin/bash

case $1 in

"1")

        echo "banzhang"

;;

"2")

        echo "cls"

;;

*)

        echo "renyao"

;;

esac

[ datas]$ chmod 777 case.sh

[ datas]$ ./case.sh 1

1

 for 循环

1.基本语法1

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

  do

    程序

  done

2.案例实操

1)从1加到100

[ datas]$ touch for1.sh

[ datas]$ vim for1.sh

#!/bin/bash

s=0

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

do

        s=$[$s+$i]

done

echo $s

[ datas]$ chmod 777 for1.sh

[ datas]$ ./for1.sh

“5050”

3.基本语法2

for 变量 in 1 2 3…

  do

    程序

  done

4.案例实操

1)打印所有输入参数

[ datas]$ touch for2.sh

[ datas]$ vim for2.sh

#!/bin/bash

#打印数字

for i in $*

    do

      echo "ban zhang love $i "

    done

[ datas]$ chmod 777 for2.sh

[ 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

[ datas]$ touch while.sh

[ datas]$ vim while.sh

#!/bin/bash

s=0

i=1

while [ $i -le 100 ]

do

        s=$[$s+$i]

        i=$[$i+1]

done

echo $s

[ datas]$ chmod 777 while.sh

[ 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

相关推荐