AI智能
改变未来

Linux Bash编程

在Linux系统介绍中,介绍了shell的多个版本,现在的Linux发行版基本都默认使用bash(Bourne Again shell),兼容Bourne shell (sh),本文将简要介绍Bash编程语法。

变量

命名规则

  • 只能使用英文字母,数字和下划线,首个字符不能以数字开头
  • 中间不能有空格,可以使用下划线(_)
  • 不能使用标点符号
  • 不能使用bash里的关键字(可用help命令查看保留关键字)

定义与使用变量

定义变量

your_name=\"abc\"echo $your_name

拼接字符串

your_name=\"world\"your_name2=\"hello,$your_name!\"echo $your_name2

数组

array_name=(value0 value1 value2 value3)valuen=${array_name} # 数组取值array_name[0]=value0 # 赋值

数组实例:

my_array=(A B \"C\" D)echo \"第一个元素为: ${my_array[0]}\"my_array[1]=becho \"数组的元素为:${my_array[*]}\" # 打印所有元素echo \"数组的元素为:${my_array[@]}\"

输出:

第一个元素为: A数组的元素为:A b C D数组的元素为:A b C D

只读变量

a=\"123\"readonly a

删除变量

unset variable_name #不能删除只读变量

不能删除只读变量

# b=10# readonly b# echo $b10# unset b-bash: unset: b: cannot unset: readonly variable#

环境变量

显示所有环境变量

env# 或者printenv

显示环境变量值

printenv LANG# 或者echo $LANG

控制语句

条件分支:if

if定义

if conditionthencommand1command2...commandNfi

if和then写在同一行时,用分号分隔。

if [ 2==2 ]; thenecho \"true\";elseecho \"false\";fi

判断条件写法

# 写法一test expression# 写法二[ expression ]# 写法三[[ expression ]]
if test 2==2; then echo \"true\"; fiif [ 2>1 ]; then echo \"true\"; fiif [[ 2>1 ]]; then echo \"true\"; fi

实例

比较两个变量的大小

a=10b=20if [ $a -eq $b ]; thenecho\"equal\";elif [ $a -lt $b ]; thenecho \"small\";elif [ $a -gt $b ]; thenecho \"big\";fi

循环:for

for定义

for var in item1 item2 ... itemNdocommand1command2...commandNdone

实例

for和do写在同一行时,用分号分隔。

for Ioop in 1 2 3 4 5doecho \"hello\"donefor Ioop in 1 2 3 4 5;doecho \"hello\"done

循环读取文件内容并输出

for i in $(cat test.txt); do echo $i; done

循环: while

while定义

while conditiondocommanddone

实例

int=1while(( $int<=5))doecho $intlet \"int++\"done

循环读取文件内容并输出

while read line; do echo $line; done<test.txt

输出:

test1test222test3test4test5

read命令

  • read命令是用于从终端或者文件中读取输入的内部命令
  • 读取整行输入
  • 每行末尾的换行符不被读入

read命令使用

从标准输入读取输入并赋值给变量

read var

从标准输入读取多个内容

read varl var2 var3

不指定变量(默认赋值给 REPLY)

read

实例

# read a123# echo $a123# read a b c1 2 3# echo $1044a1# echo $b2# echo $c3#

默认变量

# read456# echo $REPLY456#

注释

# 注释# 多行注释:<<EOF内容.......EOF

脚本参数传递

  • $0 脚本名称
  • $1~$n 获取第n个参数:
  • $# 传递到脚本的参数个数
  • $$ 脚本运行的当前进程ID号
  • $* 以一个单字符串显示所有向脚本传递的参数
  • $? 显示最后命令的退出状态。0表示没有错误,其他任何值表明有错误

vim param.sh:

#!/bin/bashecho \"脚本名称:$0\"echo \"脚本运行的当前进程ID号:$$\"echo \"参数个数:$#\"echo \"所有参数:$*\"echo \"第1个参数:$1\"echo \"第10个参数:${10}\"echo \"return \"$?

执行:

# 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个参数:10return 0#

基本运算

bash会把反引号里面当作一条命令来执行
In:

# echo `date +%y/%m/%d`20/12/27# echo `expr 2 + 2`4
# a=10# b=20# echo expr $a + $b30# echo $(($a+$b))30# echo expr $a - $b-10# echo expr $a \\* $b200# echo expr $b / $a2#
  • % 取余
  • = 赋值 a=$b 将把变量b的值赋给a
  • == 相等 相同则返回true
  • != 不相等 不相同则返回true
# a=10# b=20# echo `expr $b % $a`0# echo $[$a == $b]0# echo $[$a != $b]1#
  • -eq 检测相等
  • -ne 检测不相等
  • -gt 检测左边是否大于右边
  • -lt 检测左边是否小于右边
  • -ge 检测左边是否大于等于右边
  • -le 检测左边是否小于等于右边
# vim test.sh# cat test.sh#!/bin/basha=10b=20if [ $a -lt $b ]thenecho \"equal\"fi# chmod +x test.sh# ./test.shequal#

其它实例

内存统计

#!/bin/bash# 内存使用百分比free | sed -n \'2p\' | gawk \'x = int(( $3 / $2 ) * 100) {print x}\' | sed \'s/$/%/\'# 统计内存for i in `ps aux | awk \'{print $6}\' | grep -v \'RSS\'`; docount=$[$count+$i]doneecho \"$count/kb\"
# ./test.sh16%474608/kb

求阶乘

vim test.sh

read -p \"Enter a number:\"factorial=1for (( count=1; count<=$REPLY; count++))dofactorial=$[ $factorial * $count ]doneecho \"The factorial of $REPLY is $factorial\"
# chmod +x test.sh# ./test.shEnter a number:6The factorial of 6 is 720

–THE END–

文章标题:Linux Bash编程
本文作者:hiyo
本文链接:https://www.cnblogs.com/hiyong/p/14238495.html
欢迎关注公众号:「测试开发小记」及时接收最新技术文章!

赞(0) 打赏
未经允许不得转载:爱站程序员基地 » Linux Bash编程