变量:
变量就是可变化的量,有名称的内存空间,shell 中把变量默认为 字符型
命名规则:
1.只能包含字母、数字和下划线,并且不能以数字开头
2.不能与关键字冲突
3.尽量做到见名知义
引号:
单引号:' 强引用
双引号:" 弱引用 -- 可以实现变量替换 eg: echo $HOSTNAME "
反引号: ` 命令替换 <==> $(command) eg: echo " hello everone `ls /tmp`"
变量引用:
$VAR_NAME
${VAR_NAME}
set VAR_NAME=value
unset VAR_NAME
变量事先声明:
declare [options] VAR_NAME
options:
-i : 整形 eg: declare -i SUM=0
-x :环境变量
-a :数组
-r :只读变量,值不能改变并且不能撤消
命令行展开:
~:用户家目录
~USERNAME : 指定用户的家目录
{}:类似多项式展开 eg: # mkdir -p /tmp/{lcok,date,kill/{fuck,this}}
变量的种类:
环境变量: 对当前shell及其子shell都有效
设定: declaer -x VAR_NAME=value
expore VAR_NAME=value
取消: unset VAR-NAME
显示环境变量: export
printenv
本地变量(局部变量): 作用域为当前shell(对父shell和子shell无效)
local NAME=....
特殊变量:
$? :引用上一条命令的执行状态返回值
0 :成功
1-255:失败,1 ,2,127 -->系统预留
readonly :设定只读变量 eg: # readmonly NAME=jerry
位置变量:
位置变量用于引用传递过来的参数: ${1} ,${2} ...${11}
bash如何实现命令展开:
1.切片 :以space ,tab , enter分隔(词法分析)
2.别名替换:命令行展开 ,$ ,{} ,()
3. 可能需要重复进行1和2
4. 实现重定向: > ,>> , <
5. 执行命令
阻止展开:
转义符:\
单引号:' '
;:分号能实现语句的分割
命令的逻辑关系:
与关系 : 双目操作符
& :位与 0011011 01010101
&& :逻辑与 [ $A -eq 0 ] && echo "Hello body !"
或关系 : | : 位或
|| : 逻辑或
非关系 : !
条件测试:
test expression
[ expression ] --> expression前后有空格
[[ expession ]] -->;关键字
条件测试类型:
整数比较: [ ]
双目操作: num1 操作符 num2
-eq : = eg: [ 2 -eq 3 ] ,[[ 2 -eq 3 ]]
-gt : > 大于
-lt : < 小于
-ge : >=
-le : <=
-ne : !=
字符串测试 : [[ ]] 需要用 -->双中括号 eg: [[ string1 < string2 ]]
>
<
>=
<=
!=
==
单目:
[ -z "abc" ] :测试string是否为空,为空则真,否则为假
[ -n string ]: 为空则假,否则为真
文件测试 :
-e /path/to : 测试文件是否存在 eg: [ -e /etc/inittab ]
-f /path/to : 为普通文件
-d /path/to : 测试目录是否存在
-r :读权限
-w :写权限
-x :可执行权限
算术运算:
$(( expession ))
$[expression]
常用方法:
1.赋值给变量
2.使用echo 回显
SUM=$(($A+$B))
let VAR_NAME=NUM1 OP NUM2
echo VAR_NAME
expr num1 op num2
+ :
-
*
/
%
连接两个条件:
-a :与关系
-o : 或关系
! : 非关系
if :
if 测试条件 ;then
statement1;
...
else
statement2;
...
fi
eg: if [ SUM -eq 0 ] ; then
echo "hello world !"
else echo "No,sorry!"
fi
循环执行:
for
for 变量 in 列表; do
statement1
statemetn2
...
done
列表表示法:
{ } :eg -->{1..100} --> 1到100
`seq 1 100` : -->eg:偶数 `seq 2 2 100` 可以控制步进
`COMMAND` : 元素分割符是空格或换行符 eg: `ls /var`
while
while 条件 ; do
循环体
...
done
eg: while read LINE ;do 按行读取文件内容进行处理
...
...
done < /etc/passwd
until
until 条件 ; do
循环体
...
done
case
case 变量 in
取值1)
语句
;;
取值2)
语句
;;
*)
语句
;;
esac
break :停止循环
continue:提前结束当前循环,而后进入下一次循环
RETVAL=$?
位置变量:
# ./name.sh A B C D
$0 $1 $2 $3 $4
如何与用户交互:
read VAR_NAME
-p : " " eg: read -p "Please input your name :" NAME
-t :
bash命令的选项:
-n :用于测试脚本的语法错误
-x :调试执行,显示脚本调试执行过程中的详细过程
-v 在运行 sccript 前,先将 scripts 的内容输出到屏幕上
++ :VAR++ ,++VAR
VAR++ : 先引用 ,后自加 eg: let VAR++ <--> VAR=$[ $VAR+1 ]
++VAR : 先自加,后引用
-- : VAR-- ,--VAR
+= --> eg: let SUM+=$I <--> SUM=$(($SUM+$I))
-=
*=
/=
指定退出脚本:
状态返回值:0 1-->255
exit
随机数:RANDOM
输出菜单: -->cat
# cat <<EOF
1.Please input your name:
2.Please input your telephone number:
3.Please input your address:
4.Quit
EOF
function
bash 中定义函数的两种方法:
1. function FUNC_NAME{
body
}
2. FUNC_NAME() {
body;
}
函数的返回值:是函数调用时所执行的函数体中的最后一条语句的状态返回值;
自定义函数返回值: return #