Linux Bash编程

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

1 变量

1.1 命名规则

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

1.2 定义与使用变量

定义变量

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[n]} # 数组取值
array_name[0]=value0 # 赋值
length=${#array_name[@]} # 获取数组长度

数组实例:

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

输出:

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

1.3 只读变量

a="123"
readonly a

1.4 删除变量

unset variable_name #不能删除只读变量

不能删除只读变量

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

1.5 环境变量

显示所有环境变量

env
# 或者
printenv

显示环境变量值

printenv LANG
# 或者
echo $LANG

2 控制语句

2.1 条件分支:if

2.1.1 if定义

if condition
then
    command1
    command2
    ...
    commandN
fi

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

if [ 2==2 ]; then
	echo "true"; 
else 
	echo "false"; 
fi

2.1.2 判断条件写法

# 写法一
test expression
# 写法二
[ expression ]
# 写法三
[[ expression ]]

# 多个条件
[ expression1 ] && [ expression2 ]
[ expression1 ] || [ expression2 ]
# 或者
[ expression1 -a expression2 ]  
[ expression1 -o expression2 ]
# 或者
[[ expression1 && expression2 ]]
[[ expression1 || expression2 ]]
if test 2==2; then	echo "true"; fi
if [ 2>1 ]; then echo "true"; fi

if [[ 2>1 ]]; then	echo "true"; fi

2.1.3 实例

比较两个变量的大小

a=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

多个条件

echo "多个条件"
a=1
b=2
c=3
echo "方法1"
if [ $a -lt $b ] && [ $b -lt $c ]; then 
    echo "$a < $c"; 
fi
echo "方法2"
if [ $a -lt $b -a $b -lt $c ]; then 
    echo "$a < $c"; 
fi
echo "方法3"
if [[ $a -lt $b && $b -lt $c ]]; then 
    echo "$a < $c"; 
fi

2.2 循环:for

2.2.1 for定义

for var in item1 item2 ... itemN
do
    command1
    command2
    ...
    commandN
done

2.2.2 实例

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

for Ioop in 1 2 3 4 5
do
    echo "hello"
done

for Ioop in 1 2 3 4 5;do
    echo "hello"
done

循环读取文件内容并输出

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

循环遍历列表

list=(value1 value2 value3)
for i in ${list[*]}; do echo $i; done
# 或者
for i in ${list[@]}; do echo $i; done

2.3 循环: while

2.3.1 while定义

while condition
do
    command
done

2.3.2 实例

int=1
while(( $int<=5))
do
    echo $int
    let "int++"
done

循环读取文件内容并输出

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

输出:

test1
test222
test3
test4
test5

3 read命令

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

3.1 read命令使用

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

read var

从标准输入读取多个内容

read varl var2 var3

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

read

3.2 实例

# read a
123
# echo $a
123
# read a b c
1 2 3
# echo $a   
1
# echo $b
2
# echo $c
3
#

默认变量

# read
456
# echo $REPLY
456
#

4 注释

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

5 脚本参数传递

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

vim param.sh:

#!/bin/bash
echo "脚本名称:$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个参数:10
return 0
# 

6 基本运算

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

# echo `date +%y/%m/%d` 
20/12/27
# echo `expr 2 + 2`  
4
# a=10
# b=20
# echo expr $a + $b  
30
# echo $(($a+$b))
30
# echo expr $a - $b
-10
# echo expr $a \* $b
200
# echo expr $b / $a
2
# 
  • % 取余
  • = 赋值 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/bash
a=10
b=20
if [ $a -lt $b ]
then
        echo "equal"
fi
# chmod +x test.sh
# ./test.sh
equal
#

7 其它实例

7.1 内存统计

#!/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'`; do
    count=$[$count+$i]
done
echo "$count/kb"
# ./test.sh  
16%
474608/kb

7.2 求阶乘

vim test.sh

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

8 注意事项

8.1 文件格式转换

不同系统下默认的文件格式是不同的,比如 Windows 默认使用的文件格式是dos,Unix、Linux 默认的文件格式是unix。它们对换行的标识不一样,dos为\r\n,unix为\n。linux中使用 cat -A 命令查看dos文件,可看到文件行尾为^M$:

$ cat -A dos_file.txt 
test^M$
1^M$
2^M$
3^M$

dos文件在Linux中无法正常编译,会显示/bin/bash^M: bad interpreter报错信息。因此,如果在Windows中编写了shell脚本,需要注意将文件格式设置为unix,这里介绍2种转换方法:

  1. Linux下vi filename打开文件,执行 :set ff=unix 设置文件为unix,然后执行:wq,保存成unix格式。
  2. windows下用Notepad++打开文件,右下角,双击"Windows(CR LF)“,选择"转为 Unix(LF)”

转换成功后,执行cat -A dos_file.txt命令查看,可看到行尾是$

$ cat -A dos_file.txt 
test$
1$
2$
3$

--THE END--
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值