前言
日常用Python多一些,不过很多时候shell脚本更简单实用一些,所以有必要熟悉一下shell脚本。当然shell有他特定的一些场景,比方说我曾经改过一个vpn断线自动重连的脚本,简单实用。
另:本文比较简单,算是入门简述,类似于30分钟入门的东西,想详细看的可以去搜其他文章,很多~
注释
这个比较简单,和很多语言都一样,#
后面的就是注释,代表本行是注释,执行的时候会被忽略,没有多行注释。
注:
- 如果在开发过程中,遇到大段的代码需要临时注释起来,过一会儿又取消注释,怎么办呢?每一行加个#符号太费力了,可以把这一段要注释的代码用一对花括号括起来,定义成一个函数,没有地方调用这个函数,这块代码就不会执行,达到了和注释一样的效果。
- vim里有更简单的操作 - -
变量
变量的定义
- 首个字符必须为字母(a-z,A-Z)。
- 中间不能有空格,可以使用下划线(_)。
- 不能使用标点符号。
- 不能使用bash里的关键字(可用help命令查看保留关键字)。
- 使用等号赋值,变量名和等号之间不能有空格
如:
name="wang"
使用变量
变量名前面加$
即可,同时推荐给变量名加花括号(可选,部分场景下必选),例如(注意最后两行,如果不加花括号会导致系统认为firstNamewang是一个变量):
echo $name
read firstName
echo "firstName=$firstName"
echo "firstNmae=${firstName}"
echo "name=$fistNamewang"
echo "name=${firstName}Wang"
其他操作
- 只读变量,变量前加
readonly
,如readonly name
,此操作后不得再重新赋值 - 删除变量,
unset name
,此语句后不得再使用此变量 - 读取输入,见上面使用变量处
read firstName
,此处即为获取标准输入 - 一些转义字符,使用
echo -e xxx
可以转义成功
特殊变量
变量名 | 含义 |
---|---|
$0 | 当前脚本的文件名 |
$n | 传递给脚本或函数的参数。n 是一个数字,表示第几个参数。例如,第一个参数是$1,第二个参数是$2。 |
$# | 传递给脚本或函数的参数个数。 |
$* | 传递给脚本或函数的所有参数。 |
$@ | 传递给脚本或函数的所有参数。被双引号(" ")包含时,与 $* 稍有不同 |
$? | 上个命令的退出状态,或函数的返回值。 |
$$ | 当前Shell进程ID。对于 Shell 脚本,就是这些脚本所在的进程ID。 |
PS: $* 和 $@ 都表示传递给函数或脚本的所有参数,不被双引号(" ")包含时,都以"$1" "$2" … "$n" 的形式输出所有参数。
但是当它们被双引号(" ")包含时,"$*" 会将所有的参数作为一个整体,以"$1 $2 … $n"的形式输出所有参数;"$@" 会将各个参数分开,以"$1" "$2" … "$n" 的形式输出所有参数。
字符串
单引号,双引号
单引号里字符串原样输出,也就是说转义和变量名都是无效的,同时单引号里不能有单引号,双引号则不会。所以推荐双引号就可以了。
获取长度
string='abcd'
echo ${#string} #输出 4
数组
定义
小括号代表数组,使用空格来间隔,不支持多维数据,下标从0开始,如:
person=(name1 name2 name3)
persons = (
name1
name2
name3
)
people[0]='xxx'
people[1]='xxxx'
获取长度
获取长度,与获取字符串长度一样:
length=${#array_name[@]}
length=${#array_name[*]}
lengthn=${#array_name[n]}
echo命令
一般的使用没什么可说的,说几个特殊的:
- 显示结果重定向到文件,
echo "xxx" > file_name
- 执行命令,
date
if else
if [ expression ]
then
Statement(s) to be executed if expression is true
fi
if [ expression ]
then
Statement(s) to be executed if expression is true
else
Statement(s) to be executed if expression is not true
fi
if [ expression 1 ]
then
Statement(s) to be executed if expression 1 is true
elif [ expression 2 ]
then
Statement(s) to be executed if expression 2 is true
elif [ expression 3 ]
then
Statement(s) to be executed if expression 3 is true
else
Statement(s) to be executed if no expression is true
fi
for
for loop in 1 2 3 4 5
do
echo "The value is: $loop"
done
while
while command
do
Statement(s) to be executed if command is true
done
跳出循环
break 和 continue,和c语言中的用法一样
函数
定义函数
有两种定义方式,如下:
function_name () {
list of commands
[ return value ]
}
function function_name () {
list of commands
[ return value ]
}
调用函数
只写函数名字就可以,不用写括号。
参数
在Shell中,调用函数时可以向其传递参数。在函数体内部,通过 $n 的形式来获取参数的值,例如,$1表示第一个参数,$2表示第二个参数…
文件包含
. filename (点和名字之间有空格)
或者
source filename
技巧
执行命令以前先打印命令,只需在文件开头添加set -x
即可