引用&命令替换
- 双引号:弱引用,参数扩展
- 单引号:强引用,不可嵌套
- 大括号扩展不能被引用
- 命令执行前删除引用(不能打印单引号和双引号)
a=100
echo $a
echo "$a"
echo '$a'
echo "\"$a\""
退出状态&逻辑判断
- 反引号:`ls -l /`
- $(ls -l /)
- 可以嵌套
- echo $?:打印上一个命令的退出状态
- command1 && command2
- command1 || command2
b=echo $a
执行报错(-bash:100:command not found),linux认为前面是一个赋值,后面是一个命令
b=`echo $a`
echo $b
b=`echo $(echo $a)`
ls -l /
ls -l / && echo ok
ls -l /god && echo ok
ls -l /god || echo ok
表达式
- 算术表达式
let 算术运算表达式:let C=$A+$B
$[算术表达式]:C=$((A+B))
expr 算术表达式(表达式中各操作数及运算符之间要有空格,而且要使用命令引用):C=`expr $A+$B`
help let
a=1
b=2
((a++))
echo $a
c=$((a+b))
echo $c
- 条件表达式
[expression]
test expression
[[expression]]
help test
test 3 -gt 8
echo $?
test 3 -gt 2
echo $?
test 3 -gt 2 && echo ok
test 3 -gt 8 && echo ok
中括号和test命令的作用一样
type test
type '['
[ 3 -gt 2 ] && echo ok
[ 3 -gt 8 ] && echo ok
- 流程控制
题目:
- 添加用户
- 用户密码同用户名
- 静默允许脚本(不输出系统自带的提示)
- 避免捕获用户接口(不需要用户的其他操作)
- 程序自定义输出
man passwd
id god:查看用户
su god:切换用户(root切换普通用户不需要输入密码,普通用户切换普通用户需要输入密码)
逻辑判断时,尽量不要使用||
version1:
vi userAdd.sh
#!/bin/bash
useradd $1
echo $1 | passwd --stdin $1 &> /dev/null #--stdin从标准输入读取密码,并将默认提示输出到/dev/null
echo "user add success"
version2:
vi userAdd.sh
#!/bin/bash
[ ! $# -eq 1 ] && echo "args erro..." && exit 2 #校验参数个数
id $1 &> /dev/null && echo "user exist..." && exit 3 #校验用户是否存在
useradd $1
echo $1 | passwd --stdin $1 &> /dev/null #--stdin从标准输入读取密码,并将默认提示输出到/dev/null
echo "user add ok"
version3:
vi userAdd.sh
#!/bin/bash
[ ! $# -eq 1 ] && echo "args erro..." && exit 2 #校验参数个数
id $1 &> /dev/null && echo "user exist..." && exit 3 #校验用户是否存在
useradd $1 &> /dev/null && echo $1 | passwd --stdin $1 &> /dev/null && echo "user add ok" && exit 0
echo "I dou't know..." && exit 9