shell 是弱类型
echo "$0" #参数0echo "$1" #参数1echo "$# paramseters" # 返回参数个数echo "$@" # 以参数 “参数1 参数2 参数3”的形式返回echo "$*" #以参数 “参数1” “参数2” “参数3” ...形式返回echo "$_" #保存之前执行命令行的最后一个参数echo $? #保存了最后一条命令的退出状态 上一条执行成功,所以这条返回 0abc # 无效命令echo $? # 上一条无效命令,这条返回一个非0值echo $$ # 进程IDecho "\$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/bashx=6/3 # =号两边都不能有空格echo "$x" #6/3echo $x #6/3declare -i x # 从新定义x类型echo $x #6/3x=6/3echo $x #2x=hello # syntax error: invalid arithmetic operator (error token is ".14")echo $x #0x=3.14echo $x #0x=$[6/3]echo $x #2x=$((6/3))echo $x #2declare -r xx=5 # ./test.sh: line 18: x: readonly variableecho $x #2
x=1123let "x += 1"echo $x # 1124let x+=1echo $x # 1125y=${x/1/abc} # 将变量x的1修改为abcecho $y # abc125
双引号,单引号,反引号,反斜线
- 单引号括起来的作为普通字符串出现
- 双引号括起来的,除了“\”,“$”,“’”,“””这几个字符仍然作为特色字符并保留其特殊功能,其余字符仍作为普通字符存在
- 反引号被shell解释为命令,或优先执行,并将结果返回,替代其内容
- 反斜线 转移字符
#! /bin/bashecho "current directory is `pwd`" # current directory is /Users/xxx/xxx
全局变量,局部变量,环境变量
#! /bin/bash#定义函数func() {v1=200 #v1全局变量echo ${v1}local v2=300echo ${v2} #v2局部变量,注意函数的参数是局部变量}#调用函数funcv1=100echo ${v1}
环境变量
按照惯例,Shell中环境变量全部使用大写字母表示。
此命令可以查看环境变量
># set | more
#! /bin/bashecho "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/bashv1=123echo "$v1abc" # 没有输出,因为没有v1abc变量echo "${v1}abc" # 123abcunset v1echo $v1 # 没有输出,因为变量被清空了
