在《Linux系统介绍》中,介绍了shell的多个版本,现在的Linux发行版基本都默认使用bash(Bourne Again shell),兼容Bourne shell (sh),本文将简要介绍Bash编程语法。
变量
命名规则
- 只能使用英文字母,数字和下划线,首个字符不能以数字开头
- 中间不能有空格,可以使用下划线(_)
- 不能使用标点符号
- 不能使用bash里的关键字(可用help命令查看保留关键字)
img
定义与使用变量
定义变量1
2your_name="abc"
echo $your_name
拼接字符串1
2
3your_name="world"
your_name2="hello,$your_name!"
echo $your_name2
数组1
2
3
4array_name=(value0 value1 value2 value3)
valuen=${array_name[n]} # 数组取值
array_name[0]=value0 # 赋值
length=${#array_name[@]} # 获取数组长度
数组实例:1
2
3
4
5my_array=(A B "C" D)
echo "第一个元素为: ${my_array[0]}"
my_array[1]=b
echo "数组的元素为:${my_array[*]}" # 打印所有元素
echo "数组的元素为:${my_array[@]}"
输出:1
2
3第一个元素为: A
数组的元素为:A b C D
数组的元素为:A b C D
只读变量
1 | a="123" |
删除变量
1 | unset variable_name #不能删除只读变量 |
不能删除只读变量1
2
3
4
5
6
7# b=10
# readonly b
# echo $b
10
# unset b
-bash: unset: b: cannot unset: readonly variable
#
环境变量
显示所有环境变量1
2
3env
# 或者
printenv
显示环境变量值1
2
3printenv LANG
# 或者
echo $LANG
控制语句
条件分支:if
if定义
1 | if condition |
if和then写在同一行时,用分号分隔。
1 | if [ 2==2 ]; then |
判断条件写法
1 | # 写法一 |
1 | if test 2==2; then echo "true"; fi |
实例
比较两个变量的大小1
2
3
4
5
6
7
8
9a=10
b=20
if [ $a -eq $b ]; then
echo"equal";
elif [ $a -lt $b ]; then
echo "small";
elif [ $a -gt $b ]; then
echo "big";
fi
循环:for
for定义
1 | for var in item1 item2 ... itemN |
实例
for和do写在同一行时,用分号分隔。1
2
3
4
5
6
7
8for Ioop in 1 2 3 4 5
do
echo "hello"
done
for Ioop in 1 2 3 4 5;do
echo "hello"
done
循环读取文件内容并输出1
for i in $(cat test.txt); do echo $i; done
循环遍历列表1
2
3
4list=(value1 value2 value3)
for i in ${list[*]}; do echo $i; done
# 或者
for i in ${list[@]}; do echo $i; done
循环: while
while定义
1 | while condition |
实例
1 | int=1 |
循环读取文件内容并输出1
while read line; do echo $line; done<test.txt
输出:1
2
3
4
5test1
test222
test3
test4
test5
read命令
- read命令是用于从终端或者文件中读取输入的内部命令
- 读取整行输入
- 每行末尾的换行符不被读入
read命令使用
从标准输入读取输入并赋值给变量1
read var
从标准输入读取多个内容1
read varl var2 var3
不指定变量(默认赋值给 REPLY)1
read
实例
1 | # read a |
默认变量1
2
3
4
5# read
456
# echo $REPLY
456
#
注释
1 | # 注释 |
脚本参数传递
- $0 脚本名称
- $1~$n 获取第n个参数:
- $# 传递到脚本的参数个数
- $$ 脚本运行的当前进程ID号
- $* 以一个单字符串显示所有向脚本传递的参数
- $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误
vim param.sh:1
2
3
4
5
6
7
8
echo "脚本名称:$0"
echo "脚本运行的当前进程ID号:$$"
echo "参数个数:$#"
echo "所有参数:$*"
echo "第1个参数:$1"
echo "第10个参数:${10}"
echo "return "$?
执行:1
2
3
4
5
6
7
8
9
10# chmod +x param.sh
# ./param.sh 1 2 3 4 5 6 7 8 9 10 1
脚本名称:./param2.sh
脚本运行的当前进程ID号:21097
参数个数:11
所有参数:1 2 3 4 5 6 7 8 9 10 1
第1个参数:1
第10个参数:10
return 0
#
基本运算
bash会把反引号里面当作一条命令来执行
In:
1 | # echo `date +%y/%m/%d` |
1 | # a=10 |
- % 取余
- = 赋值 a=$b 将把变量b的值赋给a
- == 相等 相同则返回true
!= 不相等 不相同则返回true
1
2
3
4
5
6
7
8
9# a=10
# b=20
# echo `expr $b % $a`
0
# echo $[$a == $b]
0
# echo $[$a != $b]
1
#-eq 检测相等
- -ne 检测不相等
- -gt 检测左边是否大于右边
- -lt 检测左边是否小于右边
- -ge 检测左边是否大于等于右边
- -le 检测左边是否小于等于右边
1 |
|
其它实例
内存统计
1 |
|
1 | # ./test.sh |
求阶乘
vim test.sh
1
2
3
4
5
6
7read -p "Enter a number:"
factorial=1
for (( count=1; count<=$REPLY; count++))
do
factorial=$[ $factorial * $count ]
done
echo "The factorial of $REPLY is $factorial"
1 | # chmod +x test.sh |
本文标题:Linux Bash编程
文章作者:hiyo
文章链接:https://hiyongz.github.io/posts/linux-shell-bash-programing/
许可协议:本博客文章除特别声明外,均采用CC BY-NC-ND 4.0 许可协议。转载请保留原文链接及作者。