shell基础

Posted

tags:

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

一.重定向
重定向标准输入/输出/错误输出
标准输入(stdin),描述号为0;(键盘)
标准输出(stdout),描述号为1;(默认屏幕)
标准错误(stderr),描述号为2。(默认屏幕)
1)重定向标准输出
使用 > 将命令执行的正常输出重定向到文件

操作会覆盖目标文件(先清空、再写入)
改用 >> 可实现追加重定向输出

2)重定向标准错误
使用 2> 可重定向错误信息
2>> 可实现追加输出
若希望将正常输出、错误输出重定向同一个文件,可使用 &>
< 输入

二.管道
借助于管道符“|”,可以将一条命令的标准输出交给另一条命令处理,在一条命令行内可依次使用多个管道。
例:# yum list | grep ftp |wc -l

三.脚本的格式
1.新建文件(扩展名。sh)
2.内容
#!解释器
#注释
3.执行xhmod +x

四.执行脚本的3类方法
1.需要权限
#chmod +x test.sh
#./test.sh
2.不需要权限开子进程
#bash test.sh
3.不需要权限不开子进程

source test.sh

五.变量
自定义变量
变量名=值
字母,数字,下划线,不能以数字开始

系统变量:
$PATH,$HOME,$PWD,$USER,$UID,$PS1
位置变量
echo $0 #脚本的名称
echo $1 #第一个参数
echo $2 #第二个参数
echo $* #所有参数
echo $# #所有的综合
echo $$ #当前进程的进程号
echo $? #上一个程序的返回状态码

六.三种引号对赋值的影响
1.双引""
界定一个完整字符串

touch aa bb #创建了两个文件

    # touch "aa bb"        #创建了一个文件

2.单引‘‘
界定一个完整的字符串,并且可以实现屏蔽特殊符号的功能

3.反撇号或$()的应用
使用反撇号或$()时,可以将命令执行的标准输出作为字符串存储,因此称为命令替换

七.read基本用法
read -p “提示信息” 变量名
定义变量,不赋值,谁用脚本,谁赋值
#vim /mnt/nsd
#!/bin/bash
read -p "请输入用户名:" user
read -p "请输入密码:" pass
useradd $user
echo "$pass" | passwd --stdin $user

八.整数运算工具
四则运算
加法 : num1 + num2
减法 : num1 - num2
乘法 : num1 num2
整除 : num1 / num2
取余数运算
求模: num1 % num2
echo $RANDOM 随机数
1)使用expr命令
乘法操作应采用 \
转义,避免被作为Shell通配符;参与运算的整数值与运算操作符之间需要以空格分开,引用变量时必须加$符号

X=1234 //定义变量X

    # expr  $X  +  78                      //加法
1312
    # expr  $X  -  78                       //减法
1156
     # expr  $X  \*  78                      //乘法,操作符应添加\转义
96252
    # expr  $X  /  78                      //除法,仅保留整除结果
15
    # expr  $X  %  78                     //求模
64

2)使用$[ ]或$(())表达式

乘法操作*无需转义,运算符两侧可以无空格;引用变量可省略 $ 符号;计算结果替换表达式本身,可结合echo命令输出。

X=1234 //定义变量X

     # echo $[$X+78]      //加法  (可加$也可不加)
1312
     # echo $[X-78]      //减法
1156
     # echo $[X*78]       //乘法
96252
     # echo $[X/78]        //除法,仅保留整除结果
15
    # echo $[X%78]       //求模
64

九.小数运算
小数运算工具
1)bc交互式运算
先执行bc命令进入交互环境,然后再输入需要计算的表达式

bc

12.34+56.78 //加法
69.12
12.34-56.78 //减法
-44.44
12.34*56.78 //乘法
700.66
12.34/56.78 //除法
0
quit //退出交互计算器

2)bc非交互式运算
将需要运算的表达式通过管道操作交给bc运算。注意,小数位的长度可采用scale=N限制,除此以外也受参与运算的数值的小数位影响

echo ‘scale=4;12.34+5.678‘ | bc

18.018
     # echo ‘scale=4;12.34-5.678‘ | bc 
6.662
     # echo ‘scale=4;12.34*5.678‘ | bc 
70.0665
     # echo ‘scale=4;12.34/5.678‘ | bc 
2.1733

小数值的比较
基本用法
echo “数值1 比较符 数值2” | bc
如果表达式成立,,则返回的计算结果为1,否则返回0
常见比较操作: > 、>=、<、<=、==、!=

十.变量的自增/减等操作
使用$[ ]替换,或者let命令来完成
结合echo命令查看结果
i++ i=i+1
i-- i=i-1
i+=2 i=i+2
i-=2 i=i-2
i=2 i=i2
i/=2 i=i/2
i%=2 i=i%2

十一.条件测试操作
为命令执行提供最直接的识别依据
字符串匹配
比较整数值的大小
识别文件/目录的状态
多个条件/操作的逻辑组合

条件测试的基本用法
1)语法格式

使用“test 表达式”或者[ 表达式 ]都可以,表达式两边至少要留一个空格。
条件测试操作本身不显示出任何信息。测试的条件是否成立主要体现在命令执行后的返回状态(即 $?),所以可以在测试后查看变量$?的值来做出判断,或者结合&&、||等逻辑操作显示出结果(或作其他操作)
主要用法:
命令一 操作符 命令二 .....
[条件1] 操作符 [条件2]
&& 给定条件必须都成立,整个测试结果才为真
|| 只要其中一个条件成立,则整个测试结果为真

grep -qi centos /etc/redhat-release && echo yes || echo no #查看是否是centos系统

检查当前系统cpu是64位还是32位
lscpu | grep x86_64

字符串测试
字符串比较
-z 字符串的值为空
-n 字符串的值不为空
== 两个字符串相同
!= 两个字符串不相同
整数值比较
-eq 等于
-ne 不等于
-ge 大于或等于
-le 小于或等于
-gt 大于
-lt 小于
文件状态测试
-e 判断对象是否存在,若存在则结果为真
-d 判断对象是否为目录,是则为真
-f 判断对象是否为一般文件,是则为真
-r 判断对象是否有可读权限,是则为真
-w 判断对象是否有可写权限,是则为真
-x 判断对象是否有可执行权限,是则为真

十二.使用for循环结构 (固定的循环)
for循环的语法结构如下所示
for 变量名 in 值列表 变量名控制次数,影响输出
do
命令序列
done

    # vim chkhosts.sh

#!/bin/bash
for IP in {1..254}
do
ping -c 3 -i 0.2 -W 3 192.168.4.$IP &> /dev/null
if [ $? -eq 0 ] ; then
echo "Host 192.168.4.$IP is up."
else
echo "Host 192.168.4.$IP is down."
fi
done

十三.使用while循环结构 (不固定的循环)
while循环属于条件式的执行流程,会反复判断指定的测试条件,只要条件成立即执行固定的一组操作,直到条件变化为不成立为止。所以while循环的条件一般通过变量来进行控制,在循环体内对变量值做相应改变,以便在适当的时候退出,避免陷入死循环。
while 条件测试
do
命令序列
done

     # vim udelwhile.sh

#!/bin/bash
PREFIX="stu"
i=1
while [ $i -le 20 ]
do
userdel -r ${PREFIX}$i &> /dev/null
let i++
done

十四.基于case分支编写脚本
case分支属于匹配执行的方式,它针对指定的变量预先设置一个可能的取值,判断该变量的实际取值是否与预设的某一个值相匹配,如果匹配上了,就执行相应的一组操作,如果没有任何值能够匹配,就执行预先设置的默认操作。

case分支的语法结构如下所示:
case 变量值 in
模式1)
命令序列1 ;;
模式2)
命令序列2 ;;
.. ..
*)
默认命令序列
esac

     # vim test.sh

#!/bin/bash
case $1 in
redhat)
echo "fedora";;
fedora)
echo "redhat";;
*) //默认输出脚本用法
echo "用法: $0 {redhat|fedora}"
exit 1
esac

十五.函数
使用Shell函数 (给一段代码取个别名)
在Shell脚本中,将一些需重复使用的操作,定义为公共的语句块,即可称为函数。通过使用函数,可以使脚本代码更加简洁,增强易读性,提高Shell脚本的执行效率

1)函数的定义方法
格式1:
function 函数名 {
命令序列
.. ..
}

格式2:
函数名() {
命令序列
.. ..
}

2)函数的调用
直接使用“函数名”的形式调用,如果该函数能够处理位置参数,则可以使用“函数名 参数1 参数2 .. ..”的形式调用。

mycd(){ //定义函数

mkdir $1
cd $1
}

十六.中断/退出
中断 、 继续 、 退出
break 跳出当前所在的循环体,执行循环体后面的语句块
continue 跳过循环体内余下的语句,重新判断条件以决定是否需要执行下一次循环
exit 退出脚本,默认的返回值是0

for i in {1..5}
do
[ $i -eq 3 ] && continue
echo $i
done
echo over

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

Linux bash基础特性二

逆向及Bof基础实践

20155307刘浩《网络对抗》逆向及Bof基础

代码片段:Shell脚本实现重复执行和多进程

20155311高梓云《网络对抗》逆向及Bof基础

20145301赵嘉鑫《网络对抗》逆向及Bof基础