【Linux】shell常用语法以及易错点

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追踪的集合类型

  1. 数组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
  1. 键值对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中常用方式

  1. 使用$[]
  2. 执行expr命令
  3. 使用let
  4. 使用$(())

注意:所有的运算或者赋值的两边尽量不要加空格,否则会报错。但是使用$[]的时候,中间需要空格。

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:小于等于

注意点:

  1. 如果是等于或者不等于,那么-eq,-ne和==,!=都是一样的,可以在[]或者(())中进行使用
  1. 如果是大于,大于等于,小于,小于等于,使用-gt,-ge,-lt,-le,需要[]计算。而使用>,>=,<,<=需要使用(())计算

shell语句

  1. if
if [ ]
then
	# ...
elif
then
	# ...
else
	# ...
fi
  1. case
case $var in
	"")
		# ...
	;;
	"")
		# ...
	;;
esac
  1. for
for item in # ...
do
	# ...
done

for(())
do 
	# ...
done
  1. while
while [ condtion ]
do
	# ...
done
  1. 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脚本
  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

hyzhang_

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值