1. 变量
1.1 变量定义
a=1
: 直接赋值即可定义普通变量declare n
: 定义普通变量declare -i n
: 定义数值变量readonly n
: 定义只读变量export n
: 定义环境变量(环境变量为进程私有,可被子进程继承)local n
: 定义局部变量(同名则在作用域覆盖全局变量)unset n
: 取消定义变量
1.2 变量使用
使用变量内容: $name
或${name}
,花括号为了识别边界
例:
a=123
echo $a # 显示: 123
1.3 数组
# 定义数组,用括号来表示数组,数组元素用"空格"符号分割开,若元素含空格,加上引号即可
array_name=(value0 value1 value2 value3)
#读取数组
${array_name[下标]}
# 获取数组中的所有元素
${array_name[@]}
# 取得数组元素的个数
length=${#array_name[@]}
# 或者
length=${#array_name[*]}
# 取得数组单个元素的长度
lengthn=${#array_name[n]}
1.4 $()
$()
意味着先执行括号内的命令,并将命令返回的结果作为字符串替换$()
1.5 ``
`` 里面的命令会先执行,然后执行出来的结果作为字符串给外部
例:
ls -l `locate crontab`
会首先执行locate,然后ls显示locate到的目录.
1.6 引号
- 单引号内的字符只能是一般字符,不会有特殊字符,无法引用外部变量
- 而双引号可以引用外部变量.
例:
name=123
myname="$name its me" #123 its me
myname='$name its me' #$name its me
1.7 键盘读取变量:
read n #当键盘输入 123 后, n的值为123
read -p "请输入数字" n #会提示
1.8 数字运算
let : 其内置于bash中,除常用运算外,还提供了幂运算**
例:
let "a = 1 + 1"
b=9
c=5
let "a=$b+$c" # 注意有变量存在要使用双引号
let "((a=1+1,d=2+2,k=3+3))" # 多个求值
1.9. source 与 .
利用source执行脚本或. script.sh 是在本进程(bash)执行,会影响到本进程(主要是环境变量)
2. shell默认变量
$?
上一段代码或上一个命令的返回值,正常则返回0$0
代表脚本文件名$1 $2
…代表第一第二个参数$#
代表参数个数$@
代表"$1" “$2” “$3” "$4"之意,每个变量是独立的$*
代表"$1c$2c$3c$4",其中c为分隔符,默认是空格
3. 字符串操作
# 提取子字符串
string="linux is great"
echo ${string:1:4} # 输出 inux
echo ${string:1} # 从1这个位置开始截取
# 获取字符串长度
string="abcd"
echo ${#string} # 输出4
# 字符串拼接:
n="aa""bb" # n=aabb
n="$(var)kk" # 这是另一种做法
# 查找子字符串
string="life is good"
echo `expr index "$string" is`
# 字符串替换
${变量/查找值/替换值} # 替换第一个,当查找中出现了:”/”请加转义符”\/”表示。(注意第一个一定要是一个变量的名字,然后查找和替换部分如果应用变量记得加上$)
${string//substring/replacement} # 全部替换
# 字符串删除
${string#substring} # 从变量$string的开头, 删除最短匹配$substring的子串
${string##substring} # 从变量$string的开头, 删除最长匹配$substring的子串
${string%substring} # 从变量$string的结尾, 删除最短匹配$substring的子串
${string%%substring} # 从变量$string的结尾, 删除最长匹配$substring的子串
4. if语句
- 基本:
if [ command ]; then
statement
fi
- 多选择:
if [ command ];then
statement;
elif [ command ];then
statement;
else
statement;
fi
5. [] 条件判断
- 基本格式 [ EXPRESSION ]
- 格式: 中括号的左右扩弧和EXPRESSION之间都必须有空格!
不能在[ ]里面使用&&以及||,会报错
expression如下
(EXPRESSION) # EXPRESSION为真
! EXPRESSION # EXPRESSION为假
EXPRESSION -a EXPRESSION # 且 同时为真返回真
EXPRESSION -o EXPRESSION # 或 有一个为真返回真
STRING = STRING # 字符串相等 空格不得省略
STRING != STRING # 字符串不相等
-z STRING # STRING为空
-n STRING # STRING不为空
INTEGER1 eq INTEGER2 # 两数相等
INTEGER1 ne INTEGER2 # 不等于
INTEGER1 gt INTEGER2 # 大于
INTEGER1 ge INTEGER2 # 大于等于
INTEGER1 lt INTEGER2 # 小于
INTEGER1 le INTEGER2 # 小于等于
-b FILE :FILE是块设备
-c FILE :FILE是字符设备
-d FILE :FILE是文件夹
-e FILE :FILE存在
-f FILE :FILE是文件
-h FILE :FILE是硬链接
-L FILE :FILE是软链接
-r FILE :FILE存在且具有可读权限
-S FILE :FILE是Socket文件
-w FILE :FILE存在且具有可写权限
-x FILE :FILE存在且具有可执行权限
6. case语句
取值可以为变量或常数。匹配发现取值符合某一模式后,其间所有命令开始执行直至 ;;。;;相当于其他语言中的 break。如果没有匹配模式,使用星号 * 捕获该值。
case 值 in
模式1)
command1
command2
command3
;;
模式2)
command1
command2
command3
;;
*)
command1
command2
command3
;;
esac
7. 循环
7.1 for循环
# for循环实现打印1-10
for ((i=1;i<10;i++))
do
echo $i;
done
# for循环实现打印列表
for i in `cat mouse`
do
echo $i;
done
# 或
arr=(aaa bbb ccc ddd)
for i in ${arr[@]}
do
echo $i;
done
# 或
for i in a b c;
do
echo $i;
done;
7.2 while 循环
i=1
while [ $i -lt 10 ] # 如果 i 小于 10,就打印出来
do
echo $i
i=$[ $i + 1 ] # i加1
done
7.3. break 与 continue
用法与其它语言类似,例:
for i in a b c; do echo $i; if [ $i == b ]; then break; fi; done;
# 结果: a b
8. Shift的用法
-
位置参数可以用shift命令左移。比如shift 3表示原来的$4现在变成$1,原来的$5现在变成$2等等,原来的$1、$2、$3丢弃,$0不移动。不带参数的shift命令相当于shift 1。
-
Shift 命令还有另外一个重要用途, Bsh 定义了9个位置变量,从 $1 到 $9,这并不意味着用户在命令行只能使用9个参数,借助 shift 命令可以访问多于9个的参数。
9. 函数
- 定义:
function fun_name()
{
return 0-255; # 只能返回0-255之间的数字
}
fun_name()
{
echo $1 $2 $3 # 打印参数,第n个参数就是$n
}
- 调用
fun_name 1 2 3 # 参数跟在函数名后面
10. 调试
- 检查是否有语法错误:
bash -n script.sh
- 调试脚本:
bash -x test.sh
- 在脚本中动态启用调试
set +x # 开启
statements;
set -x # 关闭
- 行号变量
$LINENO
,该变量表示当前行号
附录:
延伸
- bash其实还可以用wait来实现多线程编程,参考【https://blog.csdn.net/qq_21845263/article/details/94592103】
- bash可以通过trap指令实现对信号的处理
- grep,awk,sed三大工具非常值得一学