更多内容锁定Linux专栏 说明:Shell脚本功能强大,凡是涉及编程几乎都离不开它,学会本章,你将更上一层楼!
一、基本Shell命令
[root@hadoop01 linux_exam]
/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]
hello world
[root@hadoop01 shell]
hello world
执行方式二 方式一的简化方式
[root@hadoop01 shell]
hello world
[root@hadoop01 shell]
hello world
执行方式三
[root@hadoop01 shell]
[root@hadoop01 shell]
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:
:<<E!
注释内容...
注释内容...
注释内容...
!
五、shell变量
六、 Shell命令printf命令
七、shell中常用的转义字符
八、字符串Shell命令
字符串是shell编程中最常用最有用的数据类型(除了数字和字符串,也没啥其它类型好用了),字符串 可以用单引号,也可以用双引号,也可以不用引号。 【1】计算字符串个数
my@ubuntu:~$ var="APP"
my@ubuntu:~$ echo "${#var}"
3
获取字符串长度
skill='java'
echo ${skill}
echo ${#skill}
【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}
echo ${str:2:2}
【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)
array_test=(
value1
value2
value3
value4
)
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
两个字符串不相等!
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]
do
echo “$n”
n=$n+1
done
举例2【until】
!bin/bash
declare -i n=0
until [ $n -gt 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]
└─
192.168.xx.x
。。。。。。
。。。。。。
说明:都刷到这里了,能一箭三连吗/😕/😕
|