bash语言记录
变量
#变量赋值时,等号左右不要加空格 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 }
自己选择的路,跪着也要走完。朋友们,虽然这个世界日益浮躁起来,只要能够为了当时纯粹的梦想和感动坚持努力下去,不管其它人怎么样,我们也能够保持自己的本色走下去。