bash语言记录

发布时间 2023-12-19 12:04:27作者: WTSRUVF

变量

#变量赋值时,等号左右不要加空格
myname=xiaoming

#如果是复杂的值,需要用引号包含起来,复杂的值指的是带有空格的,比如"Hello World",#因为在bash中以空格区分每个item
myvar='Hello World'
#单引号和双引号的区别是:单引号包含的值认为是一个字符串,而双引号中可以包含其他变量
newvar="More $myvar"

变量替换

可以将bash的变量=一个bash命令,命令通过括号包含,并在前面加$

myvar=$(ps -ef | grep mainboard)

 

变量传递

当通过脚本1去执行脚本2时,可以通过export 变量,将脚本1的变量传递给脚本2

script1.sh

var1=xiaoming
var2=xiaohong

echo $0 :: var1 : $var1, var2 : $var2

export var1
./script2

echo $0 :: var1 : $var1, var2 : $var2

script2.sh

echo $0 :: var1 : $var1, var2 : $var2

var1=xiaogang
var2=xiaoqiang

output

script1.sh :: var1 : xiaoming, var2 : xiaohong
script2.sh :: var1 : xiaoming, var2 : 
script1.sh :: var1 : xiaoming, var2 : xiaohong

通过输出可以得知,export相当于c语言的值传递,在script2中修改var1,并不会影响script1

 

变量输入

通过read指令等待用户输入

echo Hello, who am I talking to?

read varname

echo It\'s nice to meet you $varname

read参数

-p: 允许给出一些prompt

-s: 隐藏输入,就类似linux系统让输入密码时的样子

read -p 'Username: ' uservar
read -sp 'Password: ' passvar

输入更多变量

read var1 var2 var3

 

算术表达式

let

# let允许用户做一些简单的算术运算
let 算术表达式

 

#!/bin/bash

# Basic airthmetic using let

let a=5+4
echo $a    #9


let "a = 5 + 4"
echo $a   #9


let a++
echo $a   #10

let "a = 4 * 5"
echo $a   #20


let "a = $1 + 30"
echo $a   #30 + first

 

expr

与let不同的是,不需要左值,结果会直接输出,每个item之间需要加空格,且不需要引号

如果加了引号或者没加空格,则会将表达式作为字符串输出

#!/bin/bash

expr 5 + 4

expr "5 + 4"

expr 5+4

expr 5 \* $1    #乘法需要加转义字符

expr 11 % 2

a=$(expr 10 - 3)
echo $a

./expr_example.sh 12

output

9
5 + 4
5+4
60
1
7

 

$(( expression ))

如果不用let,也可以用$(())

#!/bin/bash

a=$(( 4 + 5))
echo $a   #8

a=$((3+5))
echo $a   #8


b=$(( a + 3 ))
echo $b  #11


b=$(( $a + 4 ))
echo $b  #12

(( b++ ))
echo $b  #13

((b += 3))
echo b $16

a=$(( 4 * 5 ))
echo $a #20

 

获取变量的长度

${#variable}

 

#!/bin/bash

a='Hello World'
echo ${#a}   #11

b=4953
echo ${#b}   #4

 

 

if 条件语句

if [<some test>]
then
    <commands>
fi

 

 

#!/bin/bash

if [ $1 -gt 100]
then
    echo Hey that\'s a large number
    pwd
fi

date

 

嵌套if

#!/bin/bash

if [ $1 -gt 100 ]   #比较用[]
then
    echo Hey that\'s a large number.

    if (( $1 % 2 == 0 ))     #算数运算用(())
    then
        echo And is also an even number.
    fi
fi

 

if else

if [<some test>]
then
    <commands>
else
    <other commands>
fi

 

if elif else

if [<some test>]
then
    <commands>
elif [<some test>]
then
    <different commands>
else
    <other commands>
fi

 

boolean运算

&&

||

#!/bin/bash

if [ -r $1 ] && [ -s $1 ]
then
    echo This file is useful.
fi

 

case 语句

case <variable> in
<pattern 1>)
    <commands>
    ;;
<pattern 2>
    <other commands>
    ;;
esac

 

#!/bin/bash

case $1 in
    start)
        echo starting
    ;;
    stop)
        echo stoping
    ;;
    restart)
        echo restarting
    ;;
    *)
        echo don\'t know
    ;;
esac

 

 

循环

while循环

while [<some test>]
do
    <commands>
done

 

#!/bin/bash

cnt=1
while [ $cnt -le 10]
do
    echo $cnt
    ((cnt++))
done

echo All done

 

for 循环

for var in <list>
do
    <commands>
done

 

值得注意的是list中以空格为分隔符

#!/bin/bash 

names='xiaoming xiaohong xiaogang'

for name in $names
do
    echo $name
done

echo All done

 

break和continue

 

select

select可以创建一个简单的菜单系统

select var in <list>
do
    <commands>
done

 

函数

function_name () {
    <commands>
}

或者


function function_name {
    <commands>
}

注意调用函数之前,要先定义好函数

 

变量范围

默认情况下,变量是全局的,当然可以通过local关键字定义局部变量

local var_name=<var_value>

 

命令重载

将系统的命令进行重载

ls () {
    command ls -lh
}