shell——shell基础语法命令总结(变量、语句、函数)

一、Shell 编程概述

1.1 shell概述

shell编程是 Linux 下的一门脚本语言——Shell 脚本。这个脚本语言可以帮助我们简化很多工作,例如编写自定义命令等,所以还是很有必要学习它的基本用法的,一个简单的 hello.sh 脚本像下面这样,第一行 #!/bin/bash 标识该 Shell 脚本由哪个 Shell 解释:

#!/bin/bash 
echo "Hello World!"

1.2 执行脚本

可以有以下两种执行方式:

# 1.直接执行
bash hello.sh
sh   hello.sh 
.    hello.sh
# 2.赋予可执行权限后执行
chmod a+x hello.sh
# 执行./hello.sh 
# 结果Hello World!

1.3 Shell 的编写流程:

  1. 编写 Shell 脚本
  2. 执行
  3. 调试

二、Shell 关键字

2.1 常用的关键字如下:

  1. echo:打印文字到屏幕
  2. read:读标准输入
  3. exec:执行另一个 Shell 脚本
  4. expr:对整数型变量进行算术运算
  5. test:用于测试变量是否相等、 是否为空、文件类型等
  6. exit:退出
#!/bin/bash 
echo "Hello Shell\nInput number:" 
# 读入变量
read VARecho "VAR is $VAR" 
# 计算变量
expr $VAR - 5 
# 测试字符串
test "Hello"="HelloWorld" 
# 测试整数
test $VAR -eq 10 
# 测试目录
test -d ./Android 
# 执行其他 Shell 脚本
exec ./othershell.sh 
# 退出
exit

运行前,你需要新建一个 othershell.sh 的文件,让它输出 I’m othershell,并且中途需要一次输入。
运行结果:

Hello Shell
Input number:
10
VAR is 10
5
I'm othershell

三、Shell 变量

Shell 变量分为 3 种:

  1. 用户变量
  2. 系统变量
  3. 环境变量

1. 用户变量

定义用户变量需要注意下面 2 点:

  1. 等号前后不能有空格:num=10
  2. 使用 $+变量名 调用变量

常见有 3 个对用户变量进行操作的前缀:

  1. unset:删除变量
  2. readonly:标记只读变量
  3. export:指定全局变量
#!/bin/bash
 # 定义普通变量  str
 str=SHENZHEN
 # 定义全局变量 name
 export name=cdeveloper
 # 定义只读变量 num
 readonly num=21
 # 打印变量的值
 echo $str
 echo $name
 echo $num 
 # 删除 str 变量
 unset str
 # 不会输出 
 SHENZHEN
 echo $str

运行结果:

SHENZHEN
cdeveloper
21

2. 系统变量

常用的系统变量有下面这些:

  1. $0 :当前程序的名称
  2. $n:第n个命令行参数(n从0开始计算)
  3. $# :命令行参数个数(除$0)
  4. $@ :所有命令行参数
  5. $* :所有命令行参数
  6. $? :前一个命令的退出状态,可用于获取函数返回值
  7. $$ :当前进程的 ID
    例如:(example.sh)
#!/bin/bash 
echo "print $"
echo "\$0 = $0"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$# = $#"
echo "\$@ = $@"
echo "\$* = $*"
echo "\$? = $?"
echo "\$$ = $$"

执行./example.sh 1 2 3 4 5 的结果:

print $
$0 = ./example.sh  //程序名
$1 = 1  //第一个参数
$2 = 2  //第二个参数
$# = 5  //命令行参数个数,这里一共5个
$@ = 1 2 3 4 5  //所有命令行参数
$* = 1 2 3 4 5  //所有命令行参数
$? = 0  //之前没有执行其他命令或者函数
$$ = 9450  //进程 ID

3. 环境变量

Shell 环境变量是所有 shell程序都会接受的一组参数,常用的有下面这几个:

  1. HOME:用户主目录
  2. PATH:系统环境变量 PATH
  3. TERM:当前终端
  4. UID:当前用户 ID
  5. PWD:当前工作目录,绝对路径
    例如:
#!/bin/bash
echo "print ENV" 
echo "\$HOME = $HOME"
echo "\$PATH = $PATH"
echo "\$TERM = $TERM"
echo "\$PWD = $PWD"
echo "\$UID = $UID"

运行结果:

print EVN 
# 当前主目录
$HOME = /root 
# PATH 环境变量
$PATH = /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
# 当前终端
$TERM = xterm 
# 当前目录
$PWD = /home/linux_shell 
# 用户 ID
$UID = 1000

四、Shell 运算

1.算术比较运算

算术比较内容结果
expr1 -eq expr2==expr1 与 expr2 相等则结果为真
expr1 -ne expr2!=expr1 与 expr2 不相等则结果为真
expr1 -gt expr2>expr1 大于 expr2 则结果为真
expr1 -ge expr2>=expr1 大于或等于 expr2 则结果为真
expr1 -lt expr2<expr1 小于 expr2 则结果为真
expr1 -le expr2<=expr1 小于或等于 expr2 则结果为真

2.算术计算

下面是 4 种比较常见的运算方法,功能都是将 m + 1:

1. m=$[ m + 1 ] 
2. m=`expr $m+1`    #一定要在两边加 ` 符号
3. let m=m+1 
4. m=$(( m + 1 ))

例如:

#!/bin/bash 
m=1
m=$[ m + 1 ]
echo $m 
m=`expr $m + 1` #注意:这个语法+号左右要加空格echo $m 
# 注意:这个语法+号左右不要加空格let m=m+1
echo $m 
m=$((m + 1))
echo $m

运行结果:

2
3
4
5

五、Shell 语句

Shell 语句跟高级语言有些类似,也包括分支,跳转,循环等。

1. if 语句

shell 的 if 结构为 if then - elif then - else,if 的判断条件主要有两种形式,例如:

#!/bin/bash 
echo "Inpu a number:"  #echo后面一定要加空格
read VAR 
# 下面这两种判断方法都可以,注意使用  
if [ $VAR -lt 10 ]  #第一种,[] 左右一定要加空格
then
    echo "小于10"
elif test $VAR -eq 10  #第二种
then
    echo "等于10"
else
    echo "大于10"
fi  

2. case 语句

case 语句有些复杂,要注意格式:

#!/bin/bash 
echo "Input a string:";
read NAME# 格式有点复杂,一定要注意
case $NAME in
    "Linux")
            echo "Linux";;  #若有多条语句只能在最后一条后面加;;
    "Unix")
            echo "Unix" ;
    *)
            echo "Not Linux or Unix" ;;
esac

运行结果:

[root@localhost ~]#  sh case.sh
Input a string:
Linux
Linux 
[root@localhost ~]#  sh case.sh
Input a string:
Unix
Unix 
[root@localhost ~]#  sh case.sh
Input a string:
1234
Not Linux or Unix

3. for 循环

for 循环有以下两种基本使用方法:(以 do 和 done 表示循环范围)

#!/bin/bash 
# 第一种,一定是 ((  ))
for ((i = 1; i <= 3; i++)) 
do
    echo $i
done 
# 第二种,VAR 依次代表每个元素 
for VAR in 4 5 6
do
    echo $VAR
done

运行结果:

1
2
3
4
5
6

4. while 循环

注意与 for 循环的区别:

#!/bin/bash
echo "请输入一个字符:"
read ch 
while [ "1" = "1" ]  #while 的死循环
do
   case $ch in
       "Y")
         echo "Right!" 
         break;;
       "N") 
         echo "Wrong!" 
         break;;
        *) 
         echo -e "\n输入有误!请重新输入:"         
         read ch;;   
   esac
done

运行结果:

[root@localhost ~]# bash while.sh 
请输入一个字符:
t 
输入有误!请重新输入:
y 
输入有误!请重新输入:
N
Wrong!

5. until 循环

until 语句可译为 “直到…的时候”,与上面的循环的不同点是它的结束条件为:判断结果为1时结束

#!/bin/bash 
i=1 
# 直到 i 等于 5 时,循环结束 
until [[ "$i" -eq 5 ]]     
do
      echo $i    
      i=$[ $i + 1 ]
done

运行结果:

1
2
3
4

6. break

Shell 中的 break 用法与高级语言相同,都是跳出循环

#!/bin/bash 
for VAR in 1 2 3 4 5
do
    if [ $VAR -eq 4 ]; then #不要忘了then        
        break    
    fi     
    echo $VAR
done

运行结果:

1
2
3

7. continue

continue 用来跳过本次循环,进入下一次循环,例如:

#!/bin/bash 
for VAR in 1 2 3 4 5
do
#   如果 VAR 等于 4,就跳过,直接进入下一次 VAR = 5 的循环     
    if [ $VAR -eq 4 ]    
    then
        continue        
    fi     
    echo $VAR
done

运行结果:

1
2
3
5

六、Shell 函数

函数可以用一句话解释:带有输入输出的具有一定功能的黑盒子,相信有过编程经验的同学不会陌生。那么,我们先来看看 Shell 中函数定义的格式。

1. 定义函数

有 2 种常见格式:

#第一种
function fun_name()
{    } 
#第二种
fun_name()
{    }

例如:

#!/bin/bash 
hello()
{
    echo "hello function"
} 
function hello_world()
{
    echo "hello_world function"
    echo $1  $2   #打印第 1 2 个参数    
    return 5
}

2. 调用函数

如何调用上面的 2 个函数呢?

# 1.直接用函数名调用函数,如
hello
hello_world 1 2  #有参数记得跟上参数列表 
# 2.使用 FUN=`函数名 [参数列表]` 来间接调用
FUN1=`hello`
FUN2=`hello_world 3 4` 
echo $FUN1
echo $FUN2

运行结果

[root@localhost ~]# bash function.sh 
hello function
hello_world function
1 2
hello function
hello_world function 3 4

3. 获取函数返回值

如何获取 hello_world 函数的返回值呢?还记得 $? 吗?

hello_world 1 2
# $? 可用于获取前一个函数的返回值,这里结果是 5
echo $? 
运行结果:
[root@localhost ~]# bash return.sh 
hello_world function1 2
5

4.shell中默认为全局变量

shell中变量默认为全局变量,例如:

#!/bin/bash
VAR=123 
#define 
functionexample()
{
    VAR=456
} 
echo $VAR  #改变前的VAR
example    #调用函数
echo $VAR  #改变后的VAR 
#运行结果:
#123
#456

5. 定义本地变量

使用 local 来在函数中定义本地变量:


#!/bin/bash
VAR=123 
#define function
example()
{    
local VAR=456    echo $VAR
} 
example    #调用函数
echo $VAR  #调用后的VAR 
#运行结果:
#456
#123

七、Shell 调试

使用下面的命令来检查是否有语法错误:

sh -n script_name.sh

使用下面的命令来执行并调试 Shell 脚本:

sh -x script_name.sh

来看个实际的例子,我们来调试下面这个 test.sh 程序:

#!/bin/bash
for VAR in 1 2 3 4 5
do
    if [ $VAR -eq 2 ]; then        
    continue     
    elif [ $VAR -eq 4 ]; then        
    continue       
    fi    
    echo $VAR
done

首先检查有无语法错误:

sh -n test.sh

没有输出,说明没有错误,开始实际调试:

sh -x test.sh

调试结果如下:

root@ubuntu:/home/linux_shell# bash -x debug.sh 
+ for VAR in 1 2 3 4 5
+ '[' 1 -eq 2 ']'
+ '[' 1 -eq 4 ']'
+ echo 1
1
+ for VAR in 1 2 3 4 5
+ '[' 2 -eq 2 ']'
+ continue
+ for VAR in 1 2 3 4 5
+ '[' 3 -eq 2 ']'
+ '[' 3 -eq 4 ']'
+ echo 3
3
+ for VAR in 1 2 3 4 5
+ '[' 4 -eq 2 ']'
+ '[' 4 -eq 4 ']'
+ continue
+ for VAR in 1 2 3 4 5
+ '[' 5 -eq 2 ']'
+ '[' 5 -eq 4 ']'
+ echo 5
5

其中带有 + 表示的是 Shell 调试器的输出,不带 + 表示我们程序的输出。

八、Shell 易错点

初学者在 Shell 编程时容易犯的大多都是语法错误:

  1. [] 内不能嵌套 ( ),可以嵌套 [ ]
  2. $[ val + 1 ] 是变量加 1 的常用方法
  3. [] 在测试或者计算中里面的内容最好都加空格
  4. 单引号和双引号差不多,单引号更加严格,双引号可以嵌套单引号
  5. 一定要注意语句的格式,例如缩进、空格等.
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值