shell 是弱类型
echo "$0" #参数0
echo "$1" #参数1
echo "$# paramseters" # 返回参数个数
echo "$@" # 以参数 “参数1 参数2 参数3”的形式返回
echo "$*" #以参数 “参数1” “参数2” “参数3” ...形式返回
echo "$_" #保存之前执行命令行的最后一个参数
echo $? #保存了最后一条命令的退出状态 上一条执行成功,所以这条返回 0
abc # 无效命令
echo $? # 上一条无效命令,这条返回一个非0值
echo $$ # 进程ID
echo "\$0=$0;\$1=$1;\$2=$2;"
exit 120 # 退出,并且退出状态是120,可以在执行完毕以后在命令行中输入echo $?来获>取
# ./test.sh a "b c"
# ./test.sh
# a
# 2 paramseters
# a b c
# a b c
# a b c
# 23579
declare attribute variable
attribute
- -p 显示所有变量的值
- -i 将变量定义为整数
- -r 将变量定义为只读
- -a 将变量声明为数组变量
- -f 显示所有自定义函数
- -x 将变量设置为环境变量,以便随后的脚本程序和程序中使用
#! /bin/bash
x=6/3 # =号两边都不能有空格
echo "$x" #6/3
echo $x #6/3
declare -i x # 从新定义x类型
echo $x #6/3
x=6/3
echo $x #2
x=hello # syntax error: invalid arithmetic operator (error token is ".14")
echo $x #0
x=3.14
echo $x #0
x=$[6/3]
echo $x #2
x=$((6/3))
echo $x #2
declare -r x
x=5 # ./test.sh: line 18: x: readonly variable
echo $x #2
x=1123
let "x += 1"
echo $x # 1124
let x+=1
echo $x # 1125
y=${x/1/abc} # 将变量x的1修改为abc
echo $y # abc125
双引号,单引号,反引号,反斜线
- 单引号括起来的作为普通字符串出现
- 双引号括起来的,除了“\”,“$”,“’”,“””这几个字符仍然作为特色字符并保留其特殊功能,其余字符仍作为普通字符存在
- 反引号被shell解释为命令,或优先执行,并将结果返回,替代其内容
- 反斜线 转移字符
#! /bin/bash
echo "current directory is `pwd`" # current directory is /Users/xxx/xxx
全局变量,局部变量,环境变量
#! /bin/bash
#定义函数
func() {
v1=200 #v1全局变量
echo ${v1}
local v2=300
echo ${v2} #v2局部变量,注意函数的参数是局部变量
}
#调用函数
func
v1=100
echo ${v1}
环境变量
按照惯例,Shell中环境变量全部使用大写字母表示。
此命令可以查看环境变量
># set | more
#! /bin/bash
echo "path $PATH"
echo "pwd $PWD"
- PATH 命令搜索路径,以冒号为分隔符。注意与windows下不同的是,当前目录不再系统路径里
- HOME 用户主目录的路径名,是cd命令的默认参数
- COLUMNS 定义里命令编辑模式下可使用命令行的长度
- HISTFILE 命令历史文件
- HISTSIZE 命令历史文件中最多可包含的命令条数
- HISTFILESIZE 命令历史文件中包含的最大行数
- IFS 定义了Shell的分隔符
- LOGNAME 当前登录名
- SHELL Shell的全路径名
- TERM 终端类型
- TMOUT Shell自动退出的时间,单位为秒,若设置为0则禁止Shell自动退出
- PWD 当前工作目录
引用变量的值,清空变量
#! /bin/bash
v1=123
echo "$v1abc" # 没有输出,因为没有v1abc变量
echo "${v1}abc" # 123abc
unset v1
echo $v1 # 没有输出,因为变量被清空了