shell中 ( ( ) ) , (()), (()),(),${}的区别
$()和``(反引号)
- $()和``都是用来做命令替换的。
- ``在所有的unix shell中都可以使用,所以移植性更高。
${}的作用
- ${}用于变量替换
- 一般情况下$var和${var}是没有区别的,但是使用${}可以更加精确的表示变量的范围。
例如:
n="hello world"
echo ${n}abc # 打印:hello worldabc
echo $nabc # 打印:空,因为没有nabc这个变量
注意:${}的功能强大,例如使用${var}可以计算var变量字符串的长度等其他功能。
$(())和$[]的区别
- $(())和$[]都是可以用来做数学运算的
a=1
b=2
c=$[a + b]
d=$((a + b))
echo $c
echo $d
注意:其中可以使用$来进行变量替换,也可以不同。
[],(())和[[]]
- []是test命令的另一种形式,注意一定要在括号中加空格。
- (())和[[]]分别是[]的数学表达式和字符串表达式的加强版
- (())可以使用特殊的数学运算符,像++,–,!,&等等
- [[]]可以进行模式匹配
单引号和双引号定义变量的区别
单引号会将变量中的$var原样输出,但是双引号会解析$var,将$var进行变量替换。
a="hello"
b="$a shell"
c='$a shell'
echo $b # hello shell
echo $c # $a shell
命令行交互read
read作用:相当于C语言中的scanf
参数:
- -p:提示符
- -t:输入有效的秒数
shell追踪的集合类型
- 数组array
- 定义方式:
array_name=(e0 e1 e2)
- 访问方式:
- 访问所有元素:
echo ${array_name[*]}
,{echo $array_name[@]}
- 访问具体元素:
echo ${array_name[0]}
- 访问所有元素:
# 定义个数组
arr=(1 "zhy" 3 "age")
# 将数组中所有的元素全部打印出来,以一整个字符串的形式
echo ${arr[*]}
# 将数组中所有的元素一个一个全部打印出来
echo ${arr[@]}
echo ${arr[0]} # 1
echo ${#arr[@]} # 数组长度:4
echo ${#arr[1]} # 元素长度:3
- 键值对map
# 声明一个map变量
declare -A m=(["name"]="zhy" ["age"]=18)
# 输出map中所有的key值
echo ${!m[@]}
# 输出map中所有的value值
echo ${m[@]}
# 添加一个变量
m["gender"]="man"
# 获取一个变量
echo ${m["gender"]}
shell运算
shell中的计算有4中常用方式
- 使用$[]
- 执行expr命令
- 使用let
- 使用$(())
注意:所有的运算或者赋值的两边尽量不要加空格,否则会报错。但是使用$[]的时候,中间需要空格。
a=1
a=$[ a + 1 ]
echo $a # 2
a=`expr $a + 1`
echo $a # 3
let a=a+1
echo $a # 4
a=$((a+1))
echo $a # 5
shell中的运算符
-eq:等于
-ne:不等于
-gt:大于
-lt:小于
-ge:大于等于
-le:小于等于
注意点:
- 如果是等于或者不等于,那么-eq,-ne和==,!=都是一样的,可以在[]或者(())中进行使用
- 如果是大于,大于等于,小于,小于等于,使用-gt,-ge,-lt,-le,需要[]计算。而使用>,>=,<,<=需要使用(())计算
shell语句
- if
if [ ]
then
# ...
elif
then
# ...
else
# ...
fi
- case
case $var in
"")
# ...
;;
"")
# ...
;;
esac
- for
for item in # ...
do
# ...
done
for(())
do
# ...
done
- while
while [ condtion ]
do
# ...
done
- until
until [ condtion ]
do
# ...
done
shell中函数
定义函数
函数有定义三种方式:
function 函数名() {
# ...
}
function 函数名 {
# ...
}
函数名() {
# ...
}
总结:要么函数名之后有(),那么函数名前面有function
调用函数
函数名 参数1 参数2 参数3
获取返回值
echo $? # $?是前一个命令退出的状态,在这里可以获取函数的返回值
预定义变量
- $0:进程名
- $1~9:位置参数
- $#:位置参数个数
- $@:所有的位置参数,一个一个分开的格式展现
- $*:所有的位置参数,一整个字符串的形式
- $?:前一个命令的退出码,也可以作为函数的返回值
- $$:执行进程的ID
shell调试
sh -n script_name.sh # 检查shell脚本是否有语法问题
sh -x script_name.sh # 执行并调试shell脚本