bash结构化命令¶
变量¶
- 首字母(a-z, A-Z)
- 中间不能有空格,可以使用下划线
- 不能使用标点符号
- 不能使用bash关键字
$ name="python" # bash变量赋值,中间不加空格
$ echo $name # 调用变量添加“$”符号
python
$ echo ${name} # 也可以添加“{}”包裹变量名
python
$ echo 'name: $name' # 单双引号之间的区别,单引号会原文呈现,不会转换变量
name: $name
$ echo "name: $name" # 双引号会自动转换变量
name: python
$ echo "name: {$name}" # 错误使用“{}”
name: {python}
$ echo "name: ${name}" # “{}”的使用是为了确认变量边界
name: python
$ echo "name $names" # 因找不到“$name”变量,只显示name
name
字符串¶
linux默认所有字符为字符串
$ var=1
$ var=$var+1 # 默认字符都为字符串
$ echo $var
1+1
$ (( var+=1 )) # “(( commands ))”双括号表示运算,括号内与命令之间要保持空格
$ echo $var
3
$ (( var++ ))
$ echo $var
4
特殊环境变量¶
$0
当前脚本名称$num
num从1开始,表示传入的第几个参数$#
传入脚本的参数个数$*
所有参数,组成的一个字符串$@
所有参数,数组,每个参数都是独立的字符串$?
当前shell进程,上一个命令的返回值,如果上一个命令成功执行,则$?
为0$$
当前shell进程pid$!
后台运行的最后一个进程的pid$-
现实shell使用的当前选项$_
之前命令的最后一个参数
# x.sh
---
#!/bin/bash
echo $1 $2 $3
---
$ chmod +x x.sh
$ ./x.sh a b c # 运行脚本-1
a b c
$ bash x.sh a b c # 运行脚本-2
$ sh x.sh a b c # 运行脚本-3
数组¶
$ array=(a b c) # 创建数组
$ echo ${array[*]} # 查看数组元素
a b c
$ array[3]=d # 添加元素
$ echo ${array[*]}
a b c d
$ unset array[3] # 删除某元素
$ echo ${array[*]}
a b c
反引号¶
输出命令结果
$ echo `date`
2018年 06月 17日 星期日 14:29:35 CST
$ echo `echo my date is `date`` # 反引号内不可使用反引号,若使用需要转义
my date isdate
$ echo `echo my date is \`date\``
my date is 2018年 06月 17日 星期日 14:30:21 CST
命令执行顺序¶
$ echo "date"; date # 分号,似的命令依次进行
date:
2018年 06月 17日 星期日 14:48:18 CST
$ echo apple > xx.txt
$ echo banana >> xx.txt
$ cat xx.txt | grep apple # 管道符号,将前者的命令输出传递给后面的命令
apple
$ `exit 0` && echo 1 # 前一个命令执行成功时,执行后面的命令
1
$ `exit 1` && echo 1
$ `exit 0` || echo 1
$ `exit 1` || echo 1 # 前一个命令执行失败时,执行后面的命令
1
控制语句---if¶
# 语法
if [condition]
then
command
elif [condition2]
command2
else
commandN
fi
# 实例
$ if [[ -f xx.txt ]]; then echo "xx.txt exists"; fi
xx.txt exists
# -f 判断文件存在,返回真
# -d 判断文件为目录,返回真
# -x 判断文件存在,并且可执行返回真
控制语句---case¶
比elif更有效的判断选择
# 语法
case expression in
pattern )
statements ;;
pattern )
statements ;;
...
esac
# 实例
xx.sh
---
#!/bin/bash
case a in
$1 )
echo "first parameter is a";;
$2 )
echo "second parameter is a";;
* )
echo "Error"
esac
---
$ ./xx.sh
$ ./xx.sh b a
second parameter is a
$ ./xx.sh a b
first parameter is a
$ ./xx.sh
Error
$ ./xx.sh c d
Error
控制语句---for¶
# 语法
for var in argument-list
do
command
done
# 实例
$ for var in a b c d
> do
> echo $var
> done
a
b
c
d
控制语句---while¶
# 语法
while condition
do
command-list
done
# 实例
$ n=1
$ while [ $n -lt 5 ];
> do
> echo "$n is less than 5"
> (( n++ ))
> done
1 is less than 5
2 is less than 5
3 is less than 5
4 is less than 5
控制语句---until¶
与whhile类似,但是不同: - while condition,满足condition条件下,下面命令执行 - until condition,执行下面命令,知道condition条件达成
$ n=1
$ until [ $n -ge 5 ]
> do
> echo "$n is less than 5"
> (( n++ ))
> done
1 is less than 5
2 is less than 5
3 is less than 5
4 is less than 5
控制语句---break¶
break就是执行之后代码,不再循环
$ while [ $n -lt 5 ]
> do
> if [ $n -eq 3 ]
> then
> break
> fi
> echo $n # 满足break条件之后,之后代码不再执行,故只有1,2
> (( n++ ))
> done
1
2
控制语句---continue¶
continue就是不执行之后的代码,跳到下一轮循环
$ n=1
$ while [ $n -lt 5 ]
> do
> (( n++ ))
> if [ $n -lt 3 ]
> then
> continue # 满足continue条件之后错过之后代码,继续循环
> fi
> echo $n
> done
3
4
5
函数¶
# 语法
[ function ] funcname [ () ] # 方括号内为可选内容
{
action;
[ return int; ]
}
# 实例
$ hello () { echo 'hello world'; }
$ hello
hello world
$ hello () { echo "hello $1"; }
$ hello world
hello world
link: http://tldp.org/LDP/Bash-Beginners-Guide/html/index.html