• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

Shell红客脚本命令

武飞扬头像
「QT(C++)开发工程师」
帮助1

学新通


更多内容锁定Linux专栏
说明:Shell脚本功能强大,凡是涉及编程几乎都离不开它,学会本章,你将更上一层楼!


学新通

一、基本Shell命令

[root@hadoop01 linux_exam]# cat /etc/shells
/bin/sh /bin/bash
/usr/bin/sh
/usr/bin/bash
/bin/tcsh
/bin/csh

问题: bash 和 sh 是什么关系?

sh 是 bash 的 快捷方式 软链接

$:代表引用
echo:显示在控制台
export PAexp$PATH:/dir/:不改变原来,追加
export PATH=/dir/:将环境变量重新赋值,覆盖
export PAexp$PATH:/dir/:不改变原来,追加

永久有效的脚本
写入:~./bashrc
生效:source ~. /bashrc

 
 
./ example.sh 外部参数1 外部参数2
$#:外部参数总个数
$*:以一个单字符串显示所有向脚本传递的参数。 如" 用 「 」 括 起 来 的 情 况 、 以 1 n"的形式输出所有参数。
* @ :与 @:与 @:与相同,但是使用时加引号,并在引号中返回每个参数。 如" @ " 用「 " 」括起来的情况、以 " 2 " … " @"用「"」括起来的情 况、以" 2" … " @"用「"」括起来的情况、以"2""n" 的形式输出所有参数。
$n:代表第n个参数,$1=外部参数1
$?:显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误。
$$:当前Shell的进程号PID
$!:后台运行的最后一个进程的ID号
$-:显示Shell使用的当前选项,与set命令功能相同。
unset: 命令可以删除变量
readonly: 可以将变量定义为只读变量,只读变量值不能被改变
read :read num 接收键盘值num,read关键字

二、运行Shell脚本的方法

执行shell脚本
执行方式一

[root@hadoop01 shell]# /bin/sh hello.sh
hello world
[root@hadoop01 shell]# /bin/bash hello.sh
hello world

执行方式二
方式一的简化方式

[root@hadoop01 shell]# bash hello.sh
hello world
[root@hadoop01 shell]# sh hello.sh
hello world

执行方式三

[root@hadoop01 shell]# chmod 755 hello.sh
[root@hadoop01 shell]# ./hello.sh
hello world

三、特殊符号Shell命令

 
 
" ":形成对应的字符串值,可以被引用$,双引号里如果有脚本命令,如date显示日期,要生效,使用反引号丶丶【“to see 丶date丶”】
‘ ’:单引号里的内容,都视为普通字符,里面用$引用,或者用反引号,都是普通字符
丶丶:反引号作用是将双引号里面的shell命令,标识成命令
I:管道,配合其他命令使用一般
>:标准输出1,覆盖方式写入 ls 1 >文件内容.txt
<:标准输入0,echo 0<文件内容.txt
标准出错2:ls file 2>a.txt 出错,文件file不存在

注意:在重定向符号右边,标准输出/输入设备文件要写成&0,&1,&2,
举例: echo “hello” 1>&2

四、 shell注释

单行注释:和python注释相同,以#号开头作为单行注释

多行注释1:

:<<EOF  
注释内容...  
注释内容...  
注释内容...  
EOF

多行注释2:

# EOF可以换成其他符号
:<<E!
注释内容...
注释内容...
注释内容...
!

五、shell变量

学新通
学新通

六、 Shell命令printf命令

学新通

七、shell中常用的转义字符

学新通

八、字符串Shell命令

字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串 可以用单引号,也可以用双引号,也可以不用引号。
【1】计算字符串个数

my@ubuntu:~$ var="APP"
my@ubuntu:~$ echo "${#var}"
3

获取字符串长度

skill='java'
echo ${skill} # 输出结果: java
echo ${#skill} # 输出结果: 4

【2】单引号

skill='java'
str='I am goot at $skill'
echo $str
输出结果为: 
I am goot at $skill

【3】双引号
学新通

【4】提取子字符串
以下实例从字符串第 2 个字符开始截取 2 个字符:

str="I am goot at $skill"
echo ${str:2} # 输出结果为: am goot at java
echo ${str:2:2} # 输出结果为: am

【5】传递参数
学新通
param.sh

#!/bin/bash
echo "Shell 传递参数实例!";
echo "执行的文件名:$0";
echo "第一个参数为:$1";
echo "第二个参数为:$2";
echo "第三个参数为:$3";
$ chmod 755 param.sh
$ ./param.sh 1 2 3
执行的文件名:./param.sh
第一个参数为:1
第二个参数为:2
第三个参数为:3

应用脚本举例:

#!/bin/bash
FunParam(){
    echo "输入第一个参数 $1 !"
    echo "输入第二个参数 $2 !"
    echo "输入第十个个参数 $10 !"
    echo "参数总数共 $# 个!"
    echo "作为一个字符串输出所有参数 $* !"
}
FunParam 1 2 3 4 5 6 7 8 9 10

执行脚本如下
学新通

【6】特殊字符

#!/bin/bash
echo "Shell 传递参数实例!";
echo "第一个参数为:$1";
echo "参数个数为:$#";
echo "传递的参数作为一个字符串显示:$*";
$ chmod  x test.sh
$ ./test.sh 1 2 3
Shell 传递参数实例!
第一个参数为:1
参数个数为:3
传递的参数作为一个字符串显示:1 2 3

【7】$* 与 $@ 区别

相同点:都是引用所有参数。
不同点:只有在双引号中体现出来。假设在脚本运行时写了三个参数 1、2、3,,则 " * " 等价于 “1 2 3”(传递了一个参数),而 “@” 等价于 “1” “2” “3”(传递了三个参数)。

#!/bin/bash
echo "-- $* 演示 ---"
for i in "$*"; do
echo $i
done
echo "-- $@ 演示 ---"
for i in "$@"; do
echo $i
Done

执行脚本,输出结果如下所示:

$ chmod  x test.sh
$ ./test.sh 1 2 3
-- $* 演示 ---
1 2 3
-- $@ 演示 ---
1
2
3

九、shell数组

定义数组
在 Shell 中,用括号()来定义表示数组,数组中元素用"空格"符号分割开。定义数组的一般形式为:

# 一般定义
array_name=(value1 value2 value3 value4)
 
# 多级定义1
array_test=(
value1 
value2 
value3 
value4
)
# 多级定义2
array_text[0]=value0
array_text[1]=value1
array_text[3]=value3
... 
...

读取数组:和读取变量名相同,使用$符号,需要加上下标名

valuen=${array_name[n]}
echo ${array_name[@]} # 读取所有

获取数组长度:获取数组长度的方法与获取字符串长度的方法相同,如图所示

# 取得数组元素的个数
length=${#array_name[@]}	# 从头到尾取
# 或者
length=${#array_name[*]}	# 取所有
# 取得数组单个元素的长度
lengthn=${#array_name[n]}	# 取特定 

十、Shell命令算术运算符

shell想要使用这些运算符,需要结合其他命令和工具来使用(因为shell中不支持简单的数学运算),如使用算符运算符就需要搭配的常用的工具有两种

`
awk
expr(使用频繁)
`

Shell 和其他编程一样,支持包括:算术、关系、布尔、字符串等运算符。 原生 bash 不支持
简单的数学运算,但是可以通过其他命令来实现,例如expr。 expr 是一款表达式计算工具,使用它能完成表达式的求值操作。
例如,两个数相加:

val=`expr 2   2`
echo $val

注意

表达式和运算符之间要有空格,例如 2 2 是不对的,必须写成 2 2。 完整的表达式要被 ` 包含,注意不是单引号,在 Esc 键下边。

下表列出了常用的算术运算符,假定变量 a 为 10,变量 b 为 20:
学新通

注意:条件表达式要放在方括号之间,并且要有空格
例如: [ a = = a== a==b] 是错误的,必须写成 [ $a == $b ]。

十一、shell命令关系运算符

学新通

脚本编写如下

#!/bin/bash
 
a=10
b=20
 
if [ $a -eq $b ]
then
   echo "$a -eq $b : a 等于 b"
else
   echo "$a -eq $b: a 不等于 b"
fi
if [ $a -ne $b ]
then
   echo "$a -ne $b: a 不等于 b"
else
   echo "$a -ne $b : a 等于 b"
fi 
学新通

将脚本执行结果如下
学新通

十二、shell命令布尔运算符

学新通

脚本编写如下

#!/bin/bash
a=10
b=20
if [ $a != $b ]
then
   echo "$a != $b : a 不等于 b"
else
   echo "$a == $b: a 等于 b"
fi 

执行脚本,结果如下
学新通

十三、shell命令逻辑运算符

学新通

编写脚本如下

#!/bin/bash
a=10
b=20
if [[ $a -lt 100 && $b -gt 100 ]]
then
   echo "返回 true"
else
   echo "返回 false"
fi 

学新通

十四、shell命令字符串运算符

学新通

#!/bin/bash
 
a="abc"
b="efg"
 
if [ $a != $b ]
then
   echo "$a != $b : a 等于 b"
else
   echo "$a != $b: a 不等于 b"
fi 

学新通


十五、测试shell命令

学新通


举例【1】:test 数值测试命令表

学新通


文件是否存在,可读?
打开脚本文件test.sh

#!/bin/bash
if [-e file ] && [-r file]
then
cat file
fi

两个字符串不相等!

#!/bin/bash
num1=100
num2=100
if test $[num1] -eq $[num2]
then
    echo '两个数相等!'
else
    echo '两个数不相等!'
fi

【2】字符串测试表
学新通
学新通

【3】文件测试表
学新通
学新通


举例【4】:多分支语句

#!/bin/bash
if [ -e file ]&&[ -r file ]
then
cat file
elif [ -e file ]
then
chmod u r file
cat file
else
touch file
fi

举例【5】:switch分支

!/bin/bash
read VAR #键盘接收用户输入
case $VAR in #判断用户输入值
"1" echo "hello"
;;
"2" echo "word"
;;
"*" echo "unknown" #通配符,任意字符
esac

说明:可以写成1),和"1"等价


十六、循环语句Shell

举例1【while】

!/bin/bash
declare -i n=0
while [ $n -le 100] #如果n小于等于100,进行循环
do 
echo “$n”
n=$n 1
done

举例2【until】

!bin/bash
declare -i n=0
until [ $n -gt 100] #如果n大于100,退出循环
do 
echo “$n”
n=$n 1
done

举例3[for]

!/bin/bash
files=丶ls丶 #执行命令,获取所有文件名
for filename in $files
do
if [ -f $filename ]
then
wc -l $filename
fi
done

举例4 【if else条件】
如果存在不满足的条件的情况

if condition
then
    command1 
    command2
    ...
    commandN
else
    command
fi

在多层嵌套条件情况

if condition1
then
    command1
elif condition2 


then 
    command2
else
    commandN
fi

应用举例

num1=$[6]
num2=$[8]
if test $[num1] -eq $[num2]
then
    echo '两个数字相等!'
else
    echo '两个数字不相等!'
fi

执行脚本,结果输出如下

两个数字相等!

举例5 【case条件】
学新通

echo '输入 1 到 4 之间的数字:'
echo '你输入的数字为:'
read num
case $num in
    1)  echo '你选择了 1'
    ;;
    2)  echo '你选择了 2'
    ;;
    3)  echo '你选择了 3'
    ;;
    4)  echo '你选择了 4'
    ;;
    *)  echo '你没有输入 1 到 4 之间的数字'
    ;;
esac
执行脚本,运行如下:
输入 1 到 5 之间的数字:4
你输入的数字为 4!
输入 1 到 5 之间的数字:8
你输入的数字不是 1 到 5 之间的! 游戏结束

学新通
学新通


函数举例,仅供参考作用:
学新通

trap命令使用:
trap  -l    :查看Linux信号

学新通


十七、shell函数

学新通

#!/bin/bash
FunReturn(){
    echo "两个数字进行相加运算..."
    echo "输入第一个数字: "
    read num
    echo "输入第二个数字: "
    read anothernum
    echo "两个数字分别为 $num 和 $anothernum !"
    return $(($num $anothernum))	# 分别返回数值
}
FunReturn		# 调用函数
echo "输入的两个数字之和为 $? !" # 使用通配符获取上一条指令的返回值

学新通

需要注意的是

所有的函数在使用前必须定义,这是因为shell解释器是顺序逐层执行的,当shell解释器发现定义的函数时,才会找到其对应的功能,进而执行。

十八、Shell实现获取本机IP地址网段

┌──(root㉿kali)-[/mnt/hgfs]
└─# ./my_ipbash.sh eth0
192.168.xx.x
。。。。。。
。。。。。。

学新通


说明:都刷到这里了,能一箭三连吗/😕/😕

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhgbijke
系列文章
更多 icon
同类精品
更多 icon
继续加载