前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Shell编程从入门到精通

Shell编程从入门到精通

原创
作者头像
硅谷子
修改2020-12-21 10:56:49
8450
修改2020-12-21 10:56:49
举报
文章被收录于专栏:Bigdata

1. 什么是Shell

Shell 是一个用 C 语言编写的程序, 通过 Shell 用户可以访问操作系统内核服务。 它类似于 DOS 下的 command 和后来的 cmd.exe。 Shell既是一种命令语言,又是一种程序设计语言。

Shell script 是一种为shell编写的脚本程序。 Shell 编程一般指shell脚本编程,不是指开发shell自身。

Shell编程跟java、php编程一样,只要有一个能编写代码的文本编辑器和一个能解释执行的脚本解释器就可以了。

Linux的Shell种类众多,一个系统可以存在多个 shell,可以通过cat /etc/shells 命令查看系统中安装的 shell。

bash 由于易用和免费,在日常工作中被广泛使用。同时, bash 也是大多数Linux 系统默认的 Shell。

2. Shell的基本格式

使用 vi 编辑器新建一个文件hello.sh(扩展名并不影响脚本执行)

代码语言:txt
复制
#!/bin/bash 
echo "Hello World !"

#! 是一个约定的标记,它告诉系统这个脚本需要什么解释器来执行,即使用哪一种 Shell

echo命令 用于向窗口输出文本。

给shell程序赋予执行权限:

chmod +x ./hello.sh #使脚本具有执行权限

执行shell程序:

./hello.sh #执行脚本

直接写 hello.sh,linux 系统会去 PATH 里寻找有没有叫hello.sh的。

用 ./hello.sh 告诉系统说,就在当前目录找

还可以作为解释器参数运行。 直接运行解释器,其参数就是 shell 脚本的文件名,如:

代码语言:txt
复制
sh /root/shelldemo/hello.sh 

在使用解释器直接执行shell程序这种方式来运行脚本,不需要考虑脚本程序的执行权限了

小结:

使用vi编辑器,创建shell程序文件。通常使用.sh作为shell程序后缀名。

shell程序的基本格式:

1、指定解释器信息。 默认:/bin/bash

2、书写shell程序代码

3、保存shell程序代码

4、执行shell程序 提前:给shell程序授予可执行权限

第一种:./xxx.sh #在当前目录中执行shell程序

第二种:/xx/xxx.sh #书写全路径的shell程序

第三种:sh /xx/xxx.sh #把shell程序作用/bin/sh解释器的参数,通过运行解释器来执行shell

3. Shell程序:变量

3.1、语法格式

变量的语法:

变量=值, 如:your_name="itcast.cn"

注意: 等号两边不能有空格,同时,变量名的命名须遵循如下规则:

l 首个字符必须为字母( a-z, A-Z)

l 中间不能有空格,可以使用下划线( _)

l 不能使用标点符号

l 不能使用 bash 里的关键字(可用 help 命令查看保留关键字)

3.2、变量使用

使用一个定义过的变量,只要在变量名前面加 $ 即可。

代码语言:shell
复制
your_name="itcast.cn" 
echo $your_name 
echo ${your_name} 

花括号是可选的,加不加都行,加花括号是为了帮助解释器识别变量的边界。

已定义的变量,可以被重新定义。

使用 readonly 命令可以将变量定义为只读变量,只读变量的值不能被改变。

格式: readonly 变量名=值

使用 unset 命令可以删除变量。 不能删除只读变量。

代码语言:shell
复制
readonly variable_name 
unset variable_name

3.3、变量类型

变量的类型可以分为:局部变量、全局变量

局部变量:局部变量在脚本或命令中定义,仅在当前 shell 实例中有效,其他 shell 启动的程序不能访问局部变量。

全局变量(环境变量):所有的程序,包括shell启动的程序,都能访问环境变量,有些程序需要环境变量来保证其正常运行。可以用过 set 命令查看当前环境变量。

小结:

变量的定义: 变量名=值 //等号两边没有空格

变量的使用: val=100 echo ${val} //使用${变量名}访问变量

val=”hello” echo $val //变量可以重复赋值

变量的类型:全局变量(环境变量)、局部变量(本地变量)

4. Shell程序:参数传递

在执行Shell程序脚本时,是可以向shell程序传递参数。

4.1、参数传递方式

传递参数的方式:./shell程序 空格 参数1 空格 参数2 ….

shell程序脚本内获取参数的格式为: $n

n 代表一个数字, 1 为执行脚本的第一个参数, 2 为执行脚本的第二个参数,以此类推……

$0 表示当前脚本名称

4.2、特殊字符

shell程序中的特殊字符:

例子:

#!/bin/bash

echo "第一个参数为: $1";

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

echo "传递的参数作为一个字符串显示: $*";

执行脚本: ./demo1.sh 1 2 3

4.2、$*和$@的区别

相同点: 都表示传递给脚本的所有参数。

不同点:

不被" "包含时, $*和$@都以$1 $2… $n 的形式组成参数列表。

被" "包含时, "$*" 会将所有的参数作为一个整体,以"$1 $2 … $n" 的形式组成一个整串; "$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式组成一个参数列表。

“$*” “1 2 3”

“$@” 1 2 3 //当作一个完整的参数

小结:

运行shell程序时传递参数: shell程序 参数1 参数2 参数n

shell程序中接收参数的方式: $n //n代表一个数字,$1表示第一个参数

例: echo $1 //接收第一个参数

$# //参数的个数

$* //参数列表 “$*”作为一个完整的字符串

* //参数列表 “$@”作为一个参数列表

5. Shell程序:运算符

Shell和其他编程语音一样,支持包括:算术、关系、布尔、字符串等运算符。

原生/bin/bash不支持简单的数学运算,但是可以通过其他命令来实现,例如:expr

expr 是一款表达式计算工具,使用它能完成表达式的求值操作。

例如,两个数相加:

val=expr 2 + 2 //千万注意不是单引号,是键盘上的~键符号

echo $val

注意:

1、运算数和运算符之间要有空格。例如 2+2 是不对的,必须写成 2 + 2。

2、完整的表达式要被 包含,注意不是单引号,在 Esc 键下边。

详细请参考附件资料《shell 运算符》

此外,还可以通过(()) 、 $[] 进行算术运算

案例1:(( )) 进行算术运算

#!/bin/bash

count=1

((count++))

echo $count

案例2: $(( ))

代码语言:shell
复制
#!/bin/bash
val=$((1+1))
echo $val

案例3:$

代码语言:shell
复制
#!/bin/bash
val=$1+2
echo $val

运算符号

代表意义

=

等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串

!=

不等于 应用于:整型或字符串比较 如果在[] 中,只能是字符串

<

小于 应用于:整型比较 在[] 中,不能使用 表示字符串

大于 应用于:整型比较 在1 > 0 中,不能使用 表示字符串

-eq

等于 应用于:整型比较

-ne

不等于 应用于:整型比较

-lt

小于 应用于:整型比较

-gt

大于 应用于:整型比较

-le

小于或等于 应用于:整型比较

-ge

大于或等于 应用于:整型比较

-a

双方都成立(and) 逻辑表达式 –a 逻辑表达式

-o

单方成立(or) 逻辑表达式 –o 逻辑表达式:

-z

空字符串

-n

非空字符串

6. 流程控制

6.1、if…else

格式1:

if [ 条件 ]; then

命令….

fi

格式2:

if [ 条件 ]; then

命令….

else

命令….

fi

格式3:

if [ 条件1 ]; then

命令1….

elif [ 条件2 ]; then

命令2….

…..elif

else

命令n

fi

案例1:条件判断

案例2:条件判断

代码语言:shell
复制
#!/bin/bash
num=10
if  $((num%2)) == 0 ;then
 echo "偶数";
else
 echo "奇数";
fi

案例3:条件判断

代码语言:shell
复制
#!/bin/bash
num1=10
num2=10
if  $num1 -gt $num2 ;then
 echo "$num1 > $num2";
elif $num1 -lt $num2 ;then
 echo "$num1 < $num2";
else
 echo "$num1 == $num2"
fi

6.2、for

方式一:

for var in con1 con2 con3 …

do

程序段..

echo $var

done

循环流程:

1、第一次循环时,$var的内容是con1

2、第二次循环时,$var的内容是con2

3、第三次循环时,$var的内容是con3

……

方式一也可以有其它写法:

for N in 1 2 3; do echo $N; done

for N in {1..3}; do echo $N; done

案例1:

代码语言:shell
复制
#!/bin/bash
for animal in cat dog elephant
do
 echo ${animal}
done

案例2:

代码语言:shell
复制
#!/bin/bash
###查询/root/shellodemo目录下所有的文件名,并赋值给filelist变量
filelist=$(ls /root/shelldemo); 
###循环遍历filelist,获取每一个文件名
for filename in $filelist
do
 #输出文件名
 echo $filename
done

方式二:用于数值方面的处理

for ((初始值; 限制值; 执行步长))

do

程序段

done

解释:

初始值:即循环初始值。例如:i=1

限制值:即循环条件。例如:i<=5

执行步长:即循环初始值修改。例如:i++

方式二的其它写法:

for ((i = 0; i <= 5; i++)); do echo "$i"; done

案例2:求10以内数值的累加和

代码语言:shell
复制
#!/bin/bash
count=0
for((i=1;i<=10;i++))
do 
 count=$(($count+$i));
done
echo “累加后的值:${count}”;

6.3、while

方式一:

while [ expression ]

do

command

done

案例1:

代码语言:shell
复制
#!/bin/bash
###演示while循环的第一种方式
while  "$y" != "yes" -a "$y" != "YES" 
do
 echo "请输入yes/YES停止循环:"
 read y ##接收录入的值
done
 echo "循环停止了!";

方式二:

代码语言:shell
复制
i=1
while ((i<=3))
do
echo $i
let i++
done 

let 命令是 BASH 中用于计算的工具,用于执行一个或多个表达式,变量计算中不需要加上 $ 来表示变量。

自加操作: let no++

自减操作: let no--

案例2:

#!/bin/bash

###while循环的第二种方式:计算10以内数值的累加

count=0

num=1

while((num<=10))

do

count=$$count+$num

##((num++))

#使用let命令,计算变量++

let num++

done

echo "10以内数值的累加和:${count}";

方式三: 无限循环

while true

do

command

done

案例3:

#!/bin/bash

###演示while死循环

while true

do

echo "请输入字符串:"

read y

if "$y" == "yes" ; then

exit 0 ##退出

fi

done

6.4、case

格式:

case $变量名称 in

匹配模式1 )

程序段

;; ==> 匹配模式1执行完毕 相当于java中的break

匹配模式2 )

程序段

;;

* ) ==> 默认值,没有匹配的模式

程序段

;;

esac ==> 代表case语句结束

案例:

#!/bin/bash

演示case的使用

代码语言:shell
复制
case $1 in
 "hello")
 echo "Hello World!"
 ;; 
 "test")
 echo "testting..."
 ;;
 "")
 echo "$0 没有参数"
 ;;
 *)
 echo "默认"
 ;;
esac

小结:

if语句:

if 条件 ; then

//程序代码

elif 条件 ; then

//代码

else

….

fi

for语句:

for 变量 in 常量1 常量2 常量3 …..

do

//循环体代码 $变量

done

for((i=0;i<上限;i++))

do

//循环体代码

done

while语句:

while 条件

do

//循环体

done

while((条件))

do

//修改条件

//循环体代码

done

case语句:

case 变量 in

常量1 )

代码

;;

常量2 )

代码

;;

*)

代码

;;

esac

7. 函数使用

所有函数在使用前必须定义。这意味着必须将函数放在脚本开始部分,直至 shell解释器首次发现它时,才可以使用。 调用函数仅使用其函数名即可。

记住:Shell中的函数书写在前面 (书写在调用函数的代码之前)

function funname ()

{

程序段;

return int;

}

1 、可以带 function fun() 定义,也可以直接 fun() 定义, 不带任何参数。

2、参数返回,可以显示加 return ,如果不加,将以最后一条命令运行结果,作为返回值。 return 后跟数值 n(0-255) 。

7.1、函数的简单使用

案例:函数的使用

#!/bin/bash

演示函数的简单使用

##注意:函数书写在shell脚本的开始位置

##定义函数,函数名为:print

print()

{

echo "hello"

echo "你好"

}

##调用print函数

print

7.2、函数的参数

在 Shell 中,调用函数时可以向其传递参数。在函数体内部, 通过 $n 的形式来获取参数的值,例如, $1 表示第一个参数, $2 表示第二个参数...

注意, 当 n>=10 时,需要使用${n} 来获取参数。

案例:带参数的函数

#!/bin/bash

演示带参数的函数

##定义函数

funWithParam()

{

echo "第一个参数为 $1"

echo "第二个参数为 $2"

echo "第十个参数为 $10"

echo "第十个参数为 ${10}"

echo "第十一个参数为 ${11}"

echo "参数总数有 $# 个"

echo "作为一个字符串输出所有参数 $*"

}

##调用函数,并传递参数

funWithParam 1 2 3 4 5 6 7 8 9 34 73

7.3、函数的返回值

案例:有返回值的函数

#!/bin/bash

###演示带返回值的参数

function getMax()

{

if $1 -lt $2 ; then

return $2

else

return $1;

fi

}

echo "Shell程序中传递的两个参数是:$1 , $2"

##调用函数

getMax $1 $2

echo "最大值::$?" ##$?表示返回值

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1. 什么是Shell
    • 2. Shell的基本格式
      • 3. Shell程序:变量
        • 3.1、语法格式
        • 3.2、变量使用
        • 3.3、变量类型
      • 4. Shell程序:参数传递
        • 4.1、参数传递方式
        • 4.2、特殊字符
        • 4.2、$*和$@的区别
      • 5. Shell程序:运算符
        • 6. 流程控制
          • 6.1、if…else
          • 6.2、for
          • 6.3、while
          • 6.4、case
          • 演示case的使用
        • 7. 函数使用
          • 7.1、函数的简单使用
          • 演示函数的简单使用
          • 7.2、函数的参数
          • 演示带参数的函数
          • 7.3、函数的返回值
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档