touch test.shvim test.shchmod 777 test.sh./test.sha="菜鸡滴滴"echo $areadonly 命令将变量定义为只读a=”菜鸡滴滴“
readonly a
unset aa="菜鸡滴滴"
b=123
c="$a$b"
#或者 c=$a$b
echo $c
${#string}a="菜鸡滴滴"
b=123
c=$a$b
# readonly a
echo $c
d=${#c}
echo $d
#或者直接输出 echo ${#c}
${string:start:length} ,其中start从0开始,length省略表示到字符串结尾${string:0-start:length},与左边开始相比,仅仅多了-0,这是固定格式。从右边开始时计数从1开始a="菜鸡滴滴"
b=123
c=$a$b
# readonly a
echo $c
d=${#c}
e=${c:0-2:2}
echo $e
# 输出:23
${array_name[index]}${nums[*]}或者${nums[@]}arr=(1 2 3 "菜鸡滴滴")
arr[10]=9
echo ${arr[@]}
${#array[@]} 或者${#array[*]}arr=(1 2 3 "菜鸡滴滴")
arr[10]=9
echo ${arr[@]}
echo ${#arr[@]}
#结果:
#1 2 3 菜鸡滴滴 9
#5
数组拼接:arr_new=(${arr1[@]} ${arr2[@]})
删除数组元素:unset关键字
unset arr[index]unset arrbash 自身提供的命令,而不是文件系统中某个执行文件


alias new_name='command',这样定义的只能在当前shell 进程中使用vi ~/.bashrcsource ~/.bashrc不换行: 加上-n 参数
name="Tom"
age=20
echo -n "${name} is ${age} years old"
解析转义字符:加上 -e 参数
在有 -e 参数时,也可使用 转义字符 \c 来命令不换行


$$ 、$!、$?获得进程ID信息
$$ :获得当前进程的ID
$! : 获得上一个进程的ID
$? : 获得上一个进程结束的状态码
例子:
echo "当前进程id : $$"
sleep 100 &
echo "上一个进程的id: $!"
echo "上一个结束的进程状态码:$?"
#结果:
#当前进程id : 13797
#上一个进程的id: 13798
#上一个结束的进程状态码:0
# $$获取当前的进程id为13797,之后后台执行sleep,这个后台进程为13798(可用ps命令验证),接着是$? ,输出上一个结束进程的状态码,上一个结束的进程为echo,顺利结束则为0
6.exit 退出当前进程
exit 为Shell 内置命令,用来退出当前Shell进程 ,并返回一个退出状态,可以用 $?(上一个结束进程状态码) 来接收这个退出状态。
exit 命令可以接收一个整数值作为参数,代表退出状态,如果不指定,默认状态值为0。一般情况下,退出状态为0表示成功,为非0表示失败。
例子:
#!/bin/bash
echo "befor exit"
exit 8
echo "after exit"
# 结果为:before exit。而after exit并未输出
接着使用echo $? 获取退出状态码,获得退出状态为:8
Shell 数学运算
如果不特别指明,每一个变量的值都是字符串。常用的数学计算如下。

if else 语句
# 格式如下
if condition
then
statement(s)
fi
# condition为判断条件
注意if后面有个then
或者
if condition
then
statement1
else
statement2
fi
或者
if condition1
then
statement1
elif condition2
then
statement2
elif condition3
then
statement3
……
else
statementn
fi
也可以将then 和if 写在一行上:
这样写if和elif后面都有then
bash
if condition; then
statement(s)
fi
注意condition后的分号,当if 和then位于同一行时,这个分号是必须的
test 命令
test是Shell 内置命令,用来检测某个条件是否成立。test通常与if语句一起使用。
test命令有很多选项,可以进行数值、字符串、文件三个方面的检测
Shell test的命令用法:test expression,也可以简写为[ expression ],[]和expression之间的空格是必须的
例子
read age
if test $age -le 2; then
echo "婴儿"
elif test $age -ge 3 && test $age -le 8;then
echo "幼儿"
elif [ $age -ge 9 ] && [ $age -le 17 ];then
echo "少年"
elif [ $age -ge 18 ] && [ $age -le 25 ];then
echo "成年"
elif [ $age -ge 26 ] && [ $age -le 40 ];then
echo "中年"
else
echo "老年"
fi
其中 -le 选项表示小于等于, -ge表示大于等于
与文件检测相关的test 选项

与数值变焦相关的test选项

注意test只能用来比较整数,小数相关的比较还是得依赖bc命令
与字符串判断相关得test选项

在test中,==、>、<只能用来比较字符串,不能用来比较数字。其次,无论是数字还是字符串,test都不支持>= 和 <= 运算符。
read str1
read str2
# 检测字符串是否为空
if [ -z "$str1" ] || [ -z "$str2"] ;then
echo "字符串不能为空"
exit 0
fi
与逻辑相关得test选项
在test中使用变量建议用双引号包围起来,以防止空字符串
[[]] : 检测条件是否成立,test的升级版
[[]] 时,不需要用“” 将变量引起来,即使为空值也不会出错>、< 进行转义,否则会出错[[]] 剔除了 -o和-a 选项,只能使用&&和||[[]]支持正则表达式,可以使用=~判断是否符合某个正则表达式,即[[ str =~ regex ]][[]] 对数字处理还是不友好,可以使用(()) 处理整形数字,用[[]] 处理字符串或者文件while 循环
while condition
do
statements
done
for 循环和for int 循环
for((exp1;exp2;exp3))
do
statements
done
# exp2为判断条件
2.python 风格
for variable in value_list
do
statements
done
对value_list的说明:
for i in 1 2 3 4 5for i in {1..100} 范围的具体格式为:{start..end}for i in $(seq 2 2 100),$() 可以取得命令的执行结果,seq用来产生某个范围内的整数,2起始,100结束,步长为2。再如 :for i in $(ls *.sh)for i in *.shfor i in $@,还有:$#、$*、$@、$?、$$