欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Linux学习笔记——Shell编程

程序员文章站 2022-07-03 12:07:37
...

Shell 编程概述

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

代码示例 new_test.sh

#!/bin/bash 

echo "Hello World!"

赋予权限才可以执行:

# 赋予可执行权限
chmod a+x new_test.sh

# 执行
./new_test.sh

# 结果
Hello World!

Shell 的编写流程:

  1. 编写 Shell 脚本
  2. 赋予可执行权限
  3. 执行,调试

Shell 关键字

常用的关键字如下:

  1. echo:打印文字到屏幕
  2. exec:执行另一个 Shell 脚本
  3. read:读标准输入
  4. expr:对整数型变量进行算术运算
  5. test:用于测试变量是否相等、 是否为空、文件类型等
  6. exit:退出

代码示例:new_test0.sh

#!/bin/bash 

echo "Hello Shell"

# 读入变量
read VAR
echo "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,并且中途需要一次输入,我这里输入的是 10:

Hello Shell
10
VAR is 10
5
I'm othershell

Shell 变量

Shell 变量分为 3 种:

  1. 用户自定义变量
  2. 预定义变量
  3. 环境变量

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

  1. 等号前后不要有空格:NUM=10
  2. 一般变量名用大写:M=1

使用 $VAR 调用变量:

VAR=2
echo $VAR
2

用户自定义变量

  这种变量只支持字符串类型,不支持其他字符,浮点等类型,常见有这 3 个前缀:

  1. unset:删除变量
  2. readonly:标记只读变量
  3. export:指定全局变量

代码示例:new_test1.sh

#!/bin/bash 

# 定义普通变量
CITY=XIAN

# 定义全局变量
export NAME=hadoop

# 定义只读变量
readonly AGE=18

# 打印变量的值
echo $CITY
echo $NAME
echo $AGE

# 删除 CITY 变量
unset CITY
# 不会输出 XIAN
echo $CITY

运行结果:

XIAN
hadoop
18

预定义变量

预定义变量常用来获取命令行的输入,有下面这些:

  1. $0 :脚本文件名
  2. $1-9 :第 1-9 个命令行参数名
  3. $# :命令行参数个数
  4. [email protected] :所有命令行参数
  5. $* :所有命令行参数
  6. $? :前一个命令的退出状态,可用于获取函数返回值
  7. $$ :执行的进程 ID

代码示例:new_test2.sh

#!/bin/bash

echo "print $"
echo "\$0 = $0"
echo "\$1 = $1"
echo "\$2 = $2"
echo "\$# = $#"
echo "\[email protected] = [email protected]"
echo "\$* = $*"
echo "\$$ = $$"
echo "\$? = $?"

执行new_test2.sh 1 2 3 4 5输出

print $
$0 = -bash
$1 = 1
$2 = 2
$# = 5
[email protected] = 1 2 3 4 5
$* = 1 2 3 4 5
$$ = 69418
$? = 0

环境变量

环境变量默认就存在,常用的有下面这几个:

  1. HOME:用户主目录
  2. PATH:系统环境变量 PATH
  3. TERM:当前终端
  4. UID:当前用户 ID
  5. PWD:当前工作目录,绝对路径

代码示例:new_test3.sh

#!/bin/bash
echo "print env"
echo $HOME
echo $PATH
echo $TERM
echo $PWD
echo $UID
print env
/root
:/export/servers/hadoop-3.1.1//bin:/export/servers/hadoop-3.1.1//sbin::/export/servers/jdk1.8.0_141/bin:/usr/lib64/qt-3.3/bin:/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin:/root/bin
xterm-256color
/home
0

Shell 运算

我们经常需要在 Shell 脚本中计算,掌握基本的运算方法很有必要,下面就是 4 种比较常见的运算方法,功能都是将 m + 1:

  1. m=$[ m + 1 ]
  2. m=expr $m + 1 # 用 “ 字符包起来
  3. let m=m+1
  4. m=$(( m + 1 ))

代码示例:new_test4.sh

#!/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 语句跟高级语言有些类似,也包括分支,跳转,循环。

if 语句

这个跟高级语言的 if - else - if 类似,只是格式有些不同而已。

代码示例:new_test5.sh

#!/bin/bash 
read VAR
# 下面这两种判断方法都可以,使用 [] 注意左右加空格
#if test $VAR -eq 10
if [ $VAR -eq 10 ]
then
    echo "true"
else
    echo "false"
fi

case 语句

代码示例:new_test6.sh

#!/bin/bash 

read NAME
# 格式有点复杂,一定要注意
case $NAME in
    "Linux")
        echo "Linux"
        ;;
    "cdeveloper")
        echo "cdeveloper"
        ;;
    *)
        echo "other"
        ;;
esac

运行结果:

# 输入 Linux
Linux
Linux

# 输入 cdeveloper
cdeveloper
cdeveloper

# 输入其他的字符串
hello
other

for 循环

代码示例:new_test7.sh

#!/bin/bash 

# 普通 for 循环
for ((i = 1; i <= 5; i++))
do
    echo $i
done


# VAR 依次代表每个元素 
for VAR in 1 2 3 4 5
do
    echo $VAR
done
1
2
3
4
5
1
2
3
4
5

while 循环

代码示例:new_test8.sh

#!/bin/bash 

VAR=10

# 如果 VAR 小于 5,就打印出来
while [ $VAR -lt 5 ]
do
    echo $VAR
#   VAR 自增 1
    VAR=$[ $VAR + 1 ]
done

运行结果

0
1
2
3
4

until 循环

until 语句与上面的循环的不同点是它的结束条件为 1:
代码示例:new_test9.sh

#!/bin/bash 

i=0  

# i 大于 5 时,循环结束 
until [[ "$i" -gt 5 ]]     
do  
    echo $i
    i=$[ $i + 1 ]
done
0
1
2
3
4
5

break

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

代码示例:new_test9.sh

#!/bin/bash 

for VAR in 1 2 3
do
#   如何 VAR 等于 2 就跳出循环
    if [ $VAR -eq 2 ]
    then
        break
    fi

    echo $VAR
done

运行结果:

1

continue

代码示例:new_test10.sh

#!/bin/bash 

for VAR in 1 2 3
do
#   如何 VAR 等于 2 就跳出循环
    if [ $VAR -eq 2 ]
    then
        continue
    fi

    echo $VAR
done

运行结果:

1
3

Shell 函数

定义函数

Shell 中函数定义的格式:

代码示例:new_test11.sh

function fun_name()
{

}

fun_name()
{

}

代码示例:new_test12.sh
#!/bin/bash

function hello_world()
{
echo “hello world fun”
echo $1 $2
return 1
}

hello()
{
echo “hello fun”
}

调用函数

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

# 1. 直接用函数名调用 hello 函数
hello

# 2. 使用「函数名 函数参数」来传递参数
hello_world 1 2

# 3. 使用「FUN=`函数名 函数参数`」 来间接调用
FUN=`hello_world 1 2`
echo $FUN

获取返回值

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

hello_world 1 2
# $? 可用于获取前一个函数的返回值,这里结果是 1 
echo $?
1

定义本地变量

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

fun()
{
    local x=1
    echo $x
}

Shell 调试

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

sh -n script_name.sh

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

sh -x script_name.sh

代码示例:new_test13.sh

#!/bin/bash

for VAR in 1 2 3
do
    if [ $VAR -eq 2 ]
    then
        continue    
    fi
    echo $VAR
done

首先检查有无语法错误:

sh -n test.sh

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

sh -x test.sh

调试结果如下:

+ [ 1 -eq 2 ]
+ echo 1
1
+ [ 2 -eq 2 ]
+ continue
+ [ 3 -eq 2 ]
+ echo 3
3

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

Shell 易错点

  1. [] 内不能嵌套 (),可以嵌套 []
  2. $[ val + 1 ] 是变量加 1 的常用方法
  3. [] 在测试或者计算中里面的内容最好都加空格
  4. 单引号和双引号差不多,单引号更加严格,双引号可以嵌套单引号
  5. 一定要注意语句的格式,例如缩进