shell总结

shell

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

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

Shell解析器有:

 /bin/sh

 /bin/bash

/bin/dash

/bin/tcsh

/bin/csh

bash

bash shell是Bourne shell的一个免费版本,它是最早的Unix shell,包括许多附加的特点。Bash有可编辑的命令行,可以回查历史命令,支持tab键补齐以使用户避免输入长的文件名。

csh

C shell使用的是“类C”的语法,借鉴了Bourne shell的许多特点,只是内部shell命令集有所不同。

ksh

Korn shell的语法与Bourne shell相同,同时具备了C shell的易用特点。许多安装脚本都使用ksh,即使不把它作为主shell,也应该在系统中安装它。

tcsh

TC shell是C shell的一个增强版本,与C shell完全兼容。

zsh

Z shell是Korn shell的一个增强版本,具备bash shell的许多特色。

Shell中的变量
JAVA中的变量:
修饰符 类型 变量名称
private string name="张三";

1.系统变量
$HOME、$PWD、$SHELL、$USER等
2.自定义变量(shell中的变量没有明显的数据类型区分)
普通变量
定义变量:变量名=值 (注意:1.等号两边不要出现空格 2.变量名称不要有特殊字符 3.变量名称不能以数字和特殊字符开头)
读取变量:echo $变量名
撤销变量:unset 变量名
静态变量(一旦创建,只可读): readonly 变量名=值

变量的作用域(只在当前会话和当前用户下有效)

全局环境变量(export)
定义变量:export 变量名=值
全局环境变量的作用域(只在当前会话下的所有用户有效)

系统环境变量
vim /etc/profile
#系统环境变量
export CLASS22=ljh
一定要激活:source /etc/profile
系统环境变量的作用域(针对于所有会话下的所有用户都有效)

查看所有变量
使用set命令

特殊的变量
#!/bin/bash

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

$#:获取所有输入参数个数,常用于循环

$*:这个变量代表命令行中所有的参数,$*把所有的参数看成一个整体
:这个变量也代表命令行中所有的参数,不过把每个参数区分对待
$?:表示读取命令的直接结果状态,返回的变量值为0,说明执行成功,非0则失败
EOF

echo $0 $1 $2 ${11}

echo "参数的个数为:" $#

echo "$/*" $*
echo "$/@"

==================================Shell中的数组
JAVA中的数组:
String[] fields={"a","b","c",....}

Shell中的数组:
数组名=(元素 元素 元素 元素 元素) 元素之间以空格分割,索引从0开始,自增
arr=(1 2 3 4 5 6 7)
根据索引读取数组元素:echo ${arr[0]}
获取数据组的长度:echo ${#arr[*]} | echo ${#arr[@]}
获取数组中所有的元素:echo ${arr[*]} | echo ${arr[@]}
修改数组:
(1)可以直接给变量重新赋值
(2)可以根据所有修改数组例如:arr[1]=c

for循环遍历数组
#!/bin/bash
myarray=(1 2 3 4 5 6 7 8 9)
for i in ${myarray[@]}
do
echo $i
done

================运算符
JAVA中的运算:
private int num1=6
private int num2=3
int result=num1/num2

Shell中的运算:
“$((运算式))”或“$[运算式]” + , - , *, /, % 加,减,乘,除,取余
echo $(($A/$B)) | echo $[$A/$B]
echo $(($A+$B)) | echo $[$A+$B]
echo $(($A-$B)) | echo $[$A-$B]
echo $(($A%$B)) | echo $[$A%$B]

echo $[(3+5)*$A]

expr + , - , \*, /, % 加,减,乘,除,取余
注意:expr运算符间要有空格
expr $A \* $B

expr `expr 3 + 5 ` \* $A

小数运算格式
echo $(echo "scale=1;5/2" | bc)

==========Shell中的条件判断
JAVA中的条件判断
private int num1=6
private int num2=3
if(num1>num2){
sout(.....)
}else{
sout(.....)
}
Shell中的条件判断
[ condition ](注意condition前后要有空格)
注意:条件非空即为true,[ jinghang ]返回true,[] 返回false。

(1)两个整数之间比较
= 字符串比较
-lt 小于(less than) -le 小于等于(less equal)
-eq 等于(equal) -gt 大于(greater than)
-ge 大于等于(greater equal) -ne 不等于(Not equal)

[ $A -lt $B ] :比较变量A是否小于变量B

(2)按照文件权限进行判断
-r 有读的权限(read) -w 有写的权限(write)
-x 有执行的权限(execute)

[ -w test06.sh ] : 判断文件是否有可写权限

(3)按照文件类型进行判断
-f 文件存在并且是一个常规的文件(file)
-e 文件存在(existence) -d 文件存在并是一个目录(directory)

[ -f test04.sh ] :判断文件是否存在,并且是一个常规文件

多条件判断:多条件判断(&& 表示前一条命令执行成功时,才执行后一条命令,|| 表示上一条命令执行失败后,才执行下一条命令)
[ class22_shell]# [ -e test100.sh ] || echo "FALSE"
FALSE

[ class22_shell]# [ -e test04.sh ] && echo "TRUE"
TRUE

Shell重中之重点(流程控制)
JAVA if条件判断
private int num1=6
private int num2=3
if(num1>num2){
sout(.....)
}else{
sout(.....)
}
Shell中的条件判断
if [ 条件判断式 ]
then
主体代码
fi
------------------------
if [ 条件判断式 ]
then
主体代码
elif [条件判断式]
then
主体代码
else
主体代码
fi
------------------------------
if [ 条件判断式 ]
then
主体代码
else
主体代码
fi

---------------------
(1)[ 条件判断式 ],中括号和条件判断式之间必须有空格
(2)if后要有空格

完成一个脚本,传入一个文件的名称,如果改文件是一个常规文件
(1)往这个常规文件中写入 bbbb
(2)如果不是常规文件,打印该文件不是常规文件

#!/bin/bash
if [ -f $1 ]
then
echo bbbb >> $1
else
echo "这个文件不是一个常规文件"
fi

case

1.基本语法

case $变量名 in

  "1"

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

    ;;

  "2"

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

    ;;

  …省略其他分支

  *

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

    ;;

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

whlie循环

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[@]}

面试题

1. 如何在脚本中使用参数 ?
第一个参数 : $1,第二个参数 :$2
例子 : 脚本会复制文件(arg1) 到目标地址(arg2)
./copy.sh file1.txt /tmp/
cat copy.sh
#!/bin/bash
cp $1 $2
2. 如何计算传递进来的参数 ?
$#
3. 如何检查之前的命令是否运行成功?
$?
4. 如何获取文件的最后一行 ?
tail -1
5. 如何获取文件的第一行 ?
head -1
6. 如何获取一个文件每一行的第三个元素 ?
awk‘{print $3}‘
7. 假如文件中每行第一个元素是FIND,如何获取第二个元素
awk‘{ if ($1 == "FIND") print$2}‘
8. 如何调试 bash 脚本
将 -xv 参数加到#!/bin/bash 后
例子:
#!/bin/bash –xv
9. 举例如何写一个函数 ?
function example {
echo "Hello world!"
}
10. 如何向连接两个字符串 ?
V1="Hello"
V2="World"
V3=${V1}${V2}
echo $V3
输出
HelloWorld
11. 如何进行两个整数相加 ?
V1=1
V2=2
let V3=$V1+$V2
echo $V3
输出
3
12. 如何检查文件系统中是否存在某个文件 ?
if [ -f /var/log/messages ]
then
echo "File exists"
fi
13. 写出 shell 脚本中所有循环语法 ?
for 循环 :
foriin$(ls);do
echo item:$i
done
while 循环 :
#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done
until 循环 :
#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo COUNTER $COUNTER
let COUNTER-=1
done
14. 每个脚本开始的#!/bin/sh 或 #!/bin/bash 表示什么意思?
这一行说明要使用的 shell。#!/bin/bash表示脚本使用 /bin/bash。对于 python 脚本,就是 #!/usr/bin/python。
15. 如何获取文本文件的第 10 行 ?
head -10 file|tail -1
16. bash 脚本文件的第一个符号是什么
#
17. 命令:[ -z"" ] && echo 0 || echo 1 的输出是什么
0
18. 如何在后台运行脚本 ?
nohup command&
19. "chmod 500 script" 做什么 ?
使脚本所有者拥有可执行权限。
20.  ">" 做什么 ?
重定向输出流到文件或另一个流。
21. & 和&& 有什么区别
& - 希望脚本在后台运行的时候使用它
&& - 当前一个脚本成功完成才执行后面的命令/脚本的时候使用它
22. bash shell 脚本中哪个符号用于注释 ?
#
23. ‘ 和 " 引号有什么区别 ?
‘ - 当我们不希望把变量转换为值的时候使用它。
" - 会计算所有变量的值并用值代替。
24. 如何在脚本文件中重定向标准输出和标准错误流到log.txt 文件 ?
在脚本文件中添加 "exec >log.txt2>&1" 命令。
25. 如何只用 echo 命令获取字符串变量的一部分 ?
echo ${variable:x:y}
x - 起始位置
y - 长度
例子:
variable="My name is Petras, and I amdeveloper."
echo ${variable:11:6} # 会显示 Petras

相关推荐