shell 脚本编程基本语法使用合集

本文详细介绍了Linux Shell脚本的基础知识,包括变量、参数传递、数组、运算符、条件判断、循环结构、函数、重定向及Here Document等核心概念,并通过实例演示了其用法,是学习Shell编程的入门教程。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


注:请注意红色标注部分

一:语法

1. 变量

1.变量名规范

  1. 名称只能使用英文字母,数字和下划线,不能是数字开头
  2. 名称中间不能有空格
  3. 不能使用标点符号
  4. 不能使用bash里面的关键字

2.变量使用

  1. 使用变量的时候可以用 变 量 名 也 可 以 用 变量名也可以用 {变量名}。这里的{}的作用是用来区分变量的边界的,像是下面这种情况中,加不加{}都可以
// 声明变量
var1="test var"
// 使用变量
echo $var1
echo ${var1}

注:在声明变量的时候,变量名,=,变量值三者之间不可以有空格哦

在使用变量的时候是否需要加{}取决于编译器能否正确识别出变量名
如:

i=2
echo "$is"
echo "${i}s"

如上面这种情况,当使用变量i的时候,就需要用{i}。是因为$is这种没有空格分隔的写法,编译器无法识别出变量名是i还是is,那么就会将变量名作为is来编译。通过上面代码中的颜色也可以很清楚的看出来变量引用部分,为黄色

单引号和双引号的区别:
echo ‘’ 的时候,会把‘’中的内容原样输出
echo ""的时候,如果有包含变量的时候,那么$变量会生效

i=0
echo '$i'
echo "$i"

输出:
$i
0

2. 脚本参数传递

变量意义
$#传递到脚本的参数个数
$*以单字符的方式显示传递的所有参数
$$脚本当前运行的进程ID
$!后台运行的最后一个进程的ID
$@分开显示传递的所有参数
$?显示最后命令退出的状态,0表示正常,其他值表示有错误
[root@centos7-01 an]#  sh a.sh c1 c2 c3 c4
4
c1 c2 c3 c4
22430

c1 c2 c3 c4
0
c1
c3
[root@centos7-01 an]#  cat a.sh
#!/bin/bash
echo "$#"       ---- 4
echo "$*"       ---- c1 c2 c3 c4
echo "$$"		---- 22430
echo "$!"       ----
echo "$@"		---- c1 c2 c3 c4
echo "$?"		---- 0
echo "$1"		---- c1
echo "$3"		---- c3

3. 数组

  1. 定义:数组用括号来表示,用空格符号分隔开。
    如array_name=(value1 value2 … valuen)
  2. 也可以通过arr[1]='xxx’的方式来进行赋值
  3. 读取数组元素:${arr_name[index]}
  4. 一次性获取数组中的所有元素:$ {arr_name[*]}或者$ {arr_name[@]}
  5. 获取数组的长度:$ {#arr_name[*]}或者${#arr_name[@]}

[root@centos7-01 an]#  cat a.sh
#!/bin/bash

# 定义数组
myArr=(1 2 A df)

echo "数组长度为${#myArr[*]}"
myArr[4]="89"
echo "增加元素后,数组长度为${#myArr[@]}"
echo "第三个元素是${myArr[2]}"
echo "输出所有元素:${myArr[*]}"
echo "输出所有元素:${myArr[@]}"


[root@centos7-01 an]#  sh a.sh c1 c2 c3 c4
数组长度为4
增加元素后,数组长度为5
第三个元素是A
输出所有元素:1 2 A df 89
输出所有元素:1 2 A df 89

4. 运算符

原生的shell是不支持运算符的,但是可以通过一些其他命令来实现shell运算的功能。如awk何expr

  1. expr:表达式计算工具,使用的时候需要反引号来指定,即``,而且运算符和数值之间需要用空格隔开
[root@centos7-01 an]# cat a.sh 
#!/bin/bash

echo `expr 2 + 2`

a=2
b=4
#注意如果是*运算符,需要进行转义
echo `expr $a \* $b`
[root@centos7-01 an]#  sh a.sh 
4
8

5. if

  1. 语法: if [ 关系表达式 ]
[root@centos7-01 an]#  sh a.sh 
2!=4
[root@centos7-01 an]# cat a.sh 
#!/bin/bash

a=2
b=4

if [ $a -eq $b ] 
then
  echo "$a==$b"
else
  echo "$a!=$b"
fi

  1. 支持的运算符
运算符含义示例
-eq两个数是否相等[ $a -eq $b ]
-ne两个数是否不相等[ $a -ne $b ]
-gt是否是大于的关系[ $a -gt $b ]
-lt是否是小于的关系[ $a -lt $b ]
-ge是否是大于等于的关系[ $a -ge $b ]
-le是否是小于等于的关系[ $a -le $b ]
!非运算符[ !false ]
-o或运算符[ true -o false ]
-a且运算符[ $a = $b -a false]
=左右是否相等[ $a = $b ]
!=左右是否不等[ $a != $b ]
-z长度是否为0[ -z $a ]
-n长度是否不为0[ -n “$a” ]
$是否为空[ $a ]

注:对于逻辑运算符,需要使用[[ ]] 双中括号来运行

逻辑运算符含义示例
&&逻辑的 AND[[ $a -lt 100 && $b -gt 100 ]]
||逻辑的 OR[[ $a -lt 100 || $b -gt 100 ]]
[root@centos7-01 an]# cat a.sh 
#!/bin/bash

a=2
b=4

if [ $a -eq $b ] 
then
  echo "$a==$b"
else
  echo "$a!=$b"
fi

if [ $a -ne $b ] 
then 
echo "$a-ne$b"
fi

if [ $b -gt $a ]
then 
echo "$b-gt$a"
fi

if [ $a -lt $b ]
then
echo "$a-lt$b"
fi

if [ $b -ge $a ]
then
echo "$b-ge$a"
fi

if [ $a -le $b ]
then
echo "$a-le$b"
fi

if [ ! $a -ge $b ]
then
echo "!$a -ge $b"
fi

if [ $a -ge $b -o $a -lt $b ]
then
echo "$a -ge $b -o $a -lt $b"
fi

if [ $a -le $b -a $a -lt $b ]
then
echo " $a -le $b -a $a -lt $b "
fi

if [ $a = `expr $b - 2` ]
then
echo " [ $a = `expr $b - 2` ] "
echo ' [ $a = `expr $b - 2` ] '
fi

if [ -z '' ]
then
echo "[ -z '' ]"
fi

if [ -n $a ]
then
echo "[ -n $a ]"
fi

if [ $a ]
then
echo "[ $a ]"
fi

输出结果:
[root@centos7-01 an]#  sh a.sh 
2!=4
2-ne4
4-gt2
2-lt4
4-ge2
2-le4
!2 -ge 4
2 -ge 4 -o 2 -lt 4
 2 -le 4 -a 2 -lt 4 
 [ 2 = 2 ] 
 [ $a = `expr $b - 2` ] 
[ -z '' ]
[ -n 2 ]
[ 2 ]

  1. 支持的文件运算符
运算符含义
-b文件是否是块设备文件
-c文件是否是字符设备文件
-d文件是否是目录
-f文件是否是文件(非设备文件)
-g文件是否设置了SGID 位
-k文件是否设置了粘着位(Sticky Bit)
-p文件是否是有名管道
-u文件是否设置了 SUID 位
-r文件是否可读
-w文件是否可写
-x文件是否可执行
-s文件是否为空即文件大小是否为0
-e文件是否存在

6. for

[root@centos7-01 an]# cat b.sh 
#!/bin/bash

myArr=( 1 2 3 4 )

for i in ${myArr[*]}
do
echo $i
done

for i in a b c d
do
echo $i
done

[root@centos7-01 an]# sh b.sh 
1
2
3
4
a
b
c
d

7. while

  1. 语法格式
    while (( ))
    do
    xxx
    done
[root@centos7-01 an]# cat b.sh 
#!/bin/bash

i=1

while(( $i<= 5 ))
do
echo "$i"
i=`expr $i + 1`
done
[root@centos7-01 an]# sh b.sh 
1
2
3
4
5

无限死循环

#!/bin/bash
i=1
while :
do
echo "$i"
done
#!/bin/bash
i=1
while true
do
echo "$i"
done

#!/bin/bash
i=1
for (( ; ; ))
do
echo "$i"
done

8. until

[root@centos7-01 an]# sh b.sh 
1
[root@centos7-01 an]# cat b.sh 
#!/bin/bash
i=1

until [ $i -eq 0 ]
do
echo "$i"
i=0
done

9. case

case xxx in
	1) command
	;;
	2) command
	;;
	*) command 
	;;
esac

case 标识着case命令的开始
esac标识着case命令的结束
n)标识着一个特定的取值模式,n可以一个明确的值,也可以是枚举
;; 标识该模式匹配的结束
*)相当于是的default

[root@centos7-01 an]# cat b.sh 
#!/bin/bash
i=you

case $i in
1) echo "i like"
;;
"you") echo "you like"
;;
*) echo "all like"
esac
[root@centos7-01 an]# sh b.sh 
you like

10. break,continue

break标识跳出一个循环:for,while,until
continue标识停止当前循环,直接开启下一次循环

11. function

[ function ] funname [()]

{

    action;

    [return int;]

}

示例

[root@centos7-01 an]# sh b.sh 
1
10
13
[root@centos7-01 an]# cat b.sh 
#!/bin/bash
i=you
# 定义一个函数
function myFun(){
echo "$1"
echo "$10"
echo "${10}"
}

# 调用函数
myFun 1 2 3 4 5 6 7 8 9 13 14 15


需要注意的是,当使用参数的时候,如果参数的个数超过10个的话,那么大于等于第10个的参数的使用需要时$ {n}的格式,而不是$ n,从上面的例子中也可以看出来,当使用$ 10的时候,输出的是10,但是使用$ {10}的时候输出的是真实的第10个数字

12. 重定向

  1. command > file :将command的执行结果完全输出到file中,覆盖file操作
  2. command >> file:将command的执行结果输出到file中,追加file操作】
  3. command < file:将file作为输入,来执行command
  • 标准输入文件(stdin):文件描述符为0;如command < file,会把file作为stdin
  • 标准输出文件(stdout):文件描述符为1;如command > file, 会把stdout重定向到file
  • 标准错误文件(stderr):文件描述符为2;如command 2>file,会把stderr重定向到file

command > file 2>&1:会把stdout和stderr合并输出到file中

13. Here Document

command << delimiter
    document
delimiter

如上述语法中,会把delimiter之间的document作为stdin给command

[root@centos7-01 an]# sh b.sh 
3
[root@centos7-01 an]# cat b.sh 
#!/bin/bash
wc -l << delimiter
2
3
4
delimiter

14. /dev/null

/dev/null 作为一个特殊的文件,写入到它的内容都会被丢弃;如果尝试从该文件读取内容,那么什么也读不到。但是 /dev/null 文件非常有用,将命令的输出重定向到它,会起到"禁止输出"的效果。

常用法:可以使用$ command > /dev/null 2>&1 来屏蔽输出

15. printf

语法:

printf format-string [ args... ]

format-string:格式控制字符串
args:参数列表

格式化字符意义
%[-n]s字符串 ,如果指定了n的话,那么字符串就会显示在10个字符宽内,长度不够的话不空格,如果长度大于10个字符全部显示。如果指定了-表示左对齐,否则就是右对齐
%d整数
%c单个字符
%[-n.m]f小数, m指的是格式化为即为小数
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值